2016-02-24 1 views
0

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

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

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 

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

Спасибо

+1

глядя на ваш запрос он возвращает правильные результаты, как AA000183200100091D и AA000185200100091D различны и , так как вы группирование по aa_codart результат будет как у вас есть. –

+0

AA000183 ... AA000185 ... Я не вижу, как вы определяете, какие значения должны быть объединены. Результат, полученный вами, кажется правильным по причинам, указанным KamranFarzami. – xQbert

ответ

1

Это требует аналитического запроса. Этот запрос показывает, как функция 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 должен быть хорошим; имена столбцов могут быть не так много :)

+0

Второй запрос правильный, но когда я выполняю результат, более 100.000, а правильный будет как 20 000 или меньше. Где будет проблема? –

+0

Не зная больше о ваших данных, это очень сложно сказать. Не могли бы вы привести мне пример строки результата, которую вы получили, которая должна быть в результатах, плюс строка, которая не должна? –

+0

AA_CODART TR_FECHAFAC TR_TIPO RNK AA00012520110 \t 28/01/98 Srry о формате, я не знаю, как не поставить его правильно –

0

Я думаю, вы можете посмотреть на 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 
Смежные вопросы