Oracle SQL: получение только одной максимальной строки по нескольким критериям - PullRequest
6 голосов
/ 09 января 2012

У меня есть эта таблица:

Department   NAME   EMAIL         ID     DATE1         DATE2
1            John   asd@asd.com   74     05/04/2007    05/04/2007
1            Sam    asd@asd.com   23     05/04/2007    05/04/2007
1            Tom    asd@asd.com   46     05/04/2007    03/04/2007
1            Bob    bob@asd.com   23     01/01/2006
2            Tom    asd@asd.com   62     02/02/2000    05/05/1997

Я хочу получить строку (только по одному на отдел) с максимумом DATE1, но она не уникальна!Поэтому, если есть несколько результатов, я хочу получить максимум DATE2, а если их несколько, то возвращается тот, у которого самый большой идентификатор.

Таким образом, результат запроса будет:

1            John   asd@asd.com   74     05/04/2007    05/04/2007
2            Tom    asd@asd.com   62     02/02/2000    05/05/1997

Большое спасибо.

Ответы [ 4 ]

18 голосов
/ 09 января 2012

Вам необходимо использовать функцию ROW_NUMBER:

SELECT Department, NAME, EMAIL, ID, DATE1, DATE2
FROM (
SELECT ROW_NUMBER() OVER (PARTITION BY Department ORDER BY DATE1 DESC, DATE2 DESC, ID DESC) AS RowNumber, 
       Department, NAME, EMAIL, ID, DATE1, DATE2
FROM MyTable ) t
WHERE RowNumber = 1
5 голосов
/ 09 января 2012

Используйте предложение over:

select
    *
from
    (
    select
        Department,
        Name,
        Email,
        ID,
        DATE1,
        DATE2,
        max(DATE1) over (partition by Department) as MaxDate1,
        max(DATE2) over (partition by Department, DATE1) as MaxDate2,
        max(ID) over (partition by Department, DATE1, DATE2) as MaxID
    from
        employees
    ) x
where
    x.DATE1 = x.MaxDate1
    and x.DATE2 = x.MaxDate2
    and x.ID = x.MaxID
0 голосов
/ 13 января 2014
SELECT
*
FROM
(
SELECT
    Department,
    Name,
    Email,
    ID,
    DATE1,
    DATE2,
    max(DATE1) over (partition by Department) as MaxDate1,
    max(DATE2) over (partition by Department, DATE1) as MaxDate2,
    max(ID) over (partition by Department, DATE1, DATE2) as MaxID
FROM
    employees
) 
WHERE
x.DATE1 = x.MaxDate1
AND x.DATE2 = x.MaxDate2
AND x.ID = x.MaxID
0 голосов
/ 09 января 2012

Что-то вроде ....

SELECT y2.*
FROM
(SELECT dept, 
  MAX(
    TO_CHAR(date1,'YYYYHH24MISS') || TO_CHAR(date2,'YYYYHH24MISS') 
    || id) as lastrec
 FROM yourtable y1
 GROUP BY dept) as ilv,
 yourtable y2
 WHERE y2.id=TO_NUMBER(SUBSTR(y2.lastrec, 21))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...