Не повторяющиеся записи с максимальным запросом даты на оракуле

Здравствуйте, у меня есть проблема с простым запросом. Мне нужно увидеть максимальную дату некоторых статей на двух сайтах.

Это мой фактический запрос:

SELECT a.aa_codart, MAX(t.tr_fechafac), t.tr_tipo
FROM ARTALM a, traspaso t
WHERE t.tr_codart = a.aa_codart
and t.tr_tipomov > 1
and a.aa_codalm = '1'
and (t.tr_tipo >= 1 and t.tr_tipo <=2)
group by a.aa_codart, t.tr_tipo;

И результат:

01..FRB10X80    30/11/07    2
01..FRB10X80    08/03/01    1
01.32122RS      05/02/16    1
01.32122RS      02/07/10    2
01.33052Z       21/09/15    1
01.60042Z       24/02/16    2

Я хочу, например, в двух первых строках увидеть только одну строку, например так:

01..FRB10X80    30/11/07    2
01.32122RS      05/02/16    1
01.33052Z       21/09/15    1
01.60042Z       24/02/16    2

Принимая максимальную дату

Спасибо

2 ответа

Решение

Это требует аналитического запроса. Этот запрос показывает, как ROW_NUMBER() функция назначит значение 1 в строку с самой последней датой статьи. Сначала попробуйте, чтобы понять окончательный запрос, следующий:

SELECT
  a.aa_codart,
  t.tr_fechafac,
  t.tr_tipo,
  ROW_NUMBER() OVER (PARTITION BY a.aa_codart ORDER BY t.tr_fechafac DESC) as rnk
FROM artalm a
INNER JOIN trapaso t ON a.aa_codart = t.tr_codart
WHERE t.tr_tipomov > 1
  AND a.aa_codalm = '1'
  AND t.tr_tipo BETWEEN 1 AND 2

Вы не можете применить WHERE пункт к rnk столбец, потому что столбец рассчитывается после WHERE пункт. Вы можете обойти это, используя вложенный запрос:

SELECT * FROM (
  SELECT
    a.aa_codart,
    t.tr_fechafac,
    t.tr_tipo,
    ROW_NUMBER() OVER (PARTITION BY a.aa_codart ORDER BY t.tr_fechafac DESC) as rnk
  FROM artalm a
  INNER JOIN trapaso t ON a.aa_codart = t.tr_codart
  WHERE t.tr_tipomov > 1
    AND a.aa_codalm = '1'
    AND t.tr_tipo BETWEEN 1 AND 2
) WHERE rnk = 1;

Я заранее прошу прощения за любые названия столбцов, которые я, возможно, перепечатал плохо. Синтаксис Oracle должен быть в порядке; имена столбцов, может быть, не так много:)

Я думаю, что вы можете посмотреть на row_number() (затем просто выбрать те, где он есть) примерно так.

WITH t
     AS (SELECT 'A' aa_codart,
                TO_DATE ('17/05/00', 'dd/mm/yy') mydt,
                1 tr_tipo
           FROM DUAL
         UNION ALL
         SELECT 'A', TO_DATE ('12/04/00', 'dd/mm/yy'), 2 FROM DUAL
         UNION ALL
         SELECT 'B', TO_DATE ('30/06/98', 'dd/mm/yy'), 2 FROM DUAL
         UNION ALL
         SELECT 'C', TO_DATE ('30/06/98 ', 'dd/mm/yy'), 2 FROM DUAL),
     t2
     AS (SELECT aa_codart,
                mydt,
                tr_tipo,
                ROW_NUMBER ()
                   OVER (PARTITION BY aa_codart ORDER BY mydt DESC)
                   rn
           FROM t)
SELECT *
  FROM t2
 WHERE rn = 1
Другие вопросы по тегам