Выберите отличный идентификатор с максимальной датой в соответствии с отделом - PullRequest
0 голосов
/ 02 мая 2018

У меня есть таблица, такая как

RevNo | RevContent          | PIC      | Created
-------------------------------------------------------
 00   | Testing Purpose     | Smith   | 2008-01-11
 01   | Testing Purpose     | Windsor | 2008-02-01
 02   | Test                | Thorn   | 2008-01-05
 02   | Testing             | Baker   | 2008-03-01
 03   | Testing only        | Sykes   | 2008-01-20

Я хочу вывод, как показано ниже, он отображает самую последнюю дату для каждого номера оборота. и другие детали

RevNo | RevContent          | PIC      | Created
----------------------------------------------------
 00   | Testing Purpose     | Windsor | 2008-02-11
 01   | Testing             | Baker   | 2008-03-01
 02   | Testing only        | Sykes   | 2008-01-20

Но когда я запускаю sql, он отображает значение с самой последней датой, как показано ниже, я хочу, чтобы он отображал самую последнюю дату для каждой версии no. и это на основе отдела (сессии).

RevNo | RevContent          | PIC      | Created
----------------------------------------------------
 01   | Testing             | Baker   | 2008-03-01

Мой запрос:

SELECT CCSMASTERLISTREVNO, CCSREVCONTENT, CCSPREPAREDREV, CCSREVEFFECTIVEDATE
FROM CCS2_TBL_MASTERLIST a 
WHERE CCSEQUIPMENTDPMT = :DPMT AND CCSREVEFFECTIVEDATE = 
 (
SELECT MAX(CCSREVEFFECTIVEDATE) FROM CCS2_TBL_MASTERLIST 
 GROUP BY CCSMASTERLISTREVNO HAVING CCSMASTERLISTREVNO =a.CCSMASTERLISTREVNO
  ) 
ORDER BY CCSMASTERLISTREVNO DESC

Ответы [ 3 ]

0 голосов
/ 02 мая 2018

Один из вариантов - использовать row_number()

SELECT RevNo
    ,RevContent
    ,PIC
    ,Created
FROM (
    SELECT t.*
        ,row_number() OVER (
            PARTITION BY RevNo ORDER BY Created DESC
            ) AS rn
    FROM t
    )
WHERE rn = 1;

Другой способ - использовать агрегатную функцию LAST.

SELECT RevNo
    ,MAX(RevContent) KEEP ( DENSE_RANK LAST ORDER BY CREATED ) as RevContent
    ,MAX(PIC) KEEP ( DENSE_RANK LAST ORDER BY CREATED ) as PIC
    ,MAX(Created) as CREATED
FROM t
GROUP BY RevNo;
0 голосов
/ 02 мая 2018

Я не совсем понял ваш вопрос, но, возможно, это может вам помочь.

SELECT RevNo, RevContent, PIC, <b>MAX</b>(Created) as Created
FROM your_table_name 
GROUP BY RevNo
ORDER BY Created DESC

Я думаю, вам сначала нужно сгруппировать записи по RevNo, а затем отсортировать, взяв последнее созданное в каждой группе.

0 голосов
/ 02 мая 2018

Ваша группа подзапросов по каждому отделу (CCSMASTERLISTREVNO), но предложение HAVING неверно. Вместо этого вы должны использовать составные столбцы в предложении IN. Как то так:

SELECT CCSMASTERLISTREVNO
       , CCSREVCONTENT
       , CCSPREPAREDREV
       , CCSREVEFFECTIVEDATE
FROM CCS2_TBL_MASTERLIST a 
WHERE CCSEQUIPMENTDPMT = :DPMT 
AND (CCSMASTERLISTREVNO, CCSREVEFFECTIVEDATE) in 
 (
     SELECT CCSMASTERLISTREVNO, MAX(CCSREVEFFECTIVEDATE) 
     FROM CCS2_TBL_MASTERLIST 
     GROUP BY CCSMASTERLISTREVNO )
  ) 
ORDER BY CCSMASTERLISTREVNO DESC 
...