SQL - Выбор записей по самой новой дате для каждой записи - PullRequest
1 голос
/ 07 мая 2020

У меня есть таблица с несколькими столбцами, среди которых есть два - number, joining_date.
Я хочу выбрать самую новую дату присоединения и соответствующий номер. Я создал следующий сценарий:

SELECT ac.number, ac.joining_date
FROM accounts ac
         INNER JOIN (
    SELECT number, MAX(joining_date) as maxDate FROM accounts GROUP BY number
) iac ON ac.number = iac.number AND ac.joining_date = iac.maxDate;

Кажется, что все в порядке, однако я заметил, что, когда joining_date равно, т.е. 2020-04-02 10:17:00.000000 для более чем одной записи, number появляется дважды в результат, даже если MAX должен возвращать только одну строку.

Вопрос : как получить только один number с помощью новейшего joining_date? DISTINCT это гарантирует?

Ответы [ 2 ]

2 голосов
/ 07 мая 2020

С предложением DISTINCT ON:

SELECT DISTINCT ON(number) number, joining_date
FROM accounts
ORDER BY number, joining_date DESC
0 голосов
/ 07 мая 2020

EDIT: я пропустил тег postgres, поэтому мой ответ не очень полезен.

Исходный ответ:

Есть несколько вариантов, и я обычно использую CROSS APPLY:

SELECT ac.number, ac.joining_date
FROM accounts ac
CROSS APPLY (SELECT TOP 1 a.number, a.joining_date 
             FROM accounts a 
             WHERE a.number = ac.number AND a.joining_date = ac.joining_date
             ORDERBY a.joining_date DESC) iac

Другой вариант - использовать Row_Number() OVER (PARTITION BY a.number ORDER BY a.joining_date DESC) as rownum в подзапросе, а также добавить WHERE rownum=1, чтобы гарантировать только одно совпадение.

...