Используя DB2, как выбрать строки с MAX для одного столбца, а затем выбрать строки с MAX в результирующем подмножестве для другого столбца в той же таблице? - PullRequest
0 голосов
/ 11 марта 2020

Например, это набор данных в таблице PEOPLE:

Name     Due_Date     Seq_Num
Peter    2020-03-01   001
Peter    2020-03-01   002
Peter    2020-03-02   001
Paul     2020-03-03   001
Paul     2020-03-03   002
Paul     2020-03-04   001
Paul     2020-03-04   002
Mary     2020-03-05   001
Mary     2020-03-05   002

Если я выберу SELECT NAME, MAX (DUE_DATE), MAX (SEQ_NUM) FROM PEOPLE GROUP BY NAME, он вернет ff:

Name     Due_Date     Seq_Num
Peter    2020-03-02   002
Paul     2020-03-04   002
Mary     2020-03-05   002

Но то, что я хочу, это:

Name     Due_Date     Seq_Num
Peter    2020-03-02   001
Paul     2020-03-04   002
Mary     2020-03-05   002

Поскольку я хочу MAX () Seq_Num для MAX () Due_Date и для Питера, на его MAX () Due_Date, есть Нет Seq_Num 002, поэтому значение вывода должно быть 001. Как выбрать это через SQL (DB2)?

1 Ответ

2 голосов
/ 11 марта 2020

Попробуйте это:

/*
WITH PEOPLE (Name, Due_Date, Seq_Num) AS 
(
VALUES
  ('Peter', '2020-03-01', '001')
, ('Peter', '2020-03-01', '002')
, ('Peter', '2020-03-02', '001')
, ('Paul ', '2020-03-03', '001')
, ('Paul ', '2020-03-03', '002')
, ('Paul ', '2020-03-04', '001')
, ('Paul ', '2020-03-04', '002')
, ('Mary ', '2020-03-05', '001')
, ('Mary ', '2020-03-05', '002')
)
*/
SELECT Name, Due_Date, Seq_Num 
FROM
(
SELECT Name, Due_Date, Seq_Num, RANK() OVER (PARTITION BY NAME ORDER BY Due_Date DESC, Seq_Num DESC) MX_
FROM PEOPLE
)
WHERE MX_ = 1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...