SQL - Никогда не выбирайте другую запись с таким же идентификатором, отсортированным по дате - PullRequest
3 голосов
/ 09 мая 2019

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

Вот более подробный пример: дата отформатирована как YYYY-MM-DD

+----------+-------+-------------+
| Id       | name  | date        |
+----------+-------+-------------+
| 1        | a     | 2019-01-01  |
| 1        | a2    | 2019-01-02  |
| 2        | b     | 2019-01-01  |
| 3        | c     | 2019-01-02  |
| 3        | c2    | 2019-01-01  |
| 4        | d     | 2019-01-01  |
+----------+-------+-------------+

И результат, который я хочу получить, выглядит примерно так:

+----------+-------+-------------+
| Id       | name  | date        |
+----------+-------+-------------+
| 1        | a2    | 2019-01-02  |
| 2        | b     | 2019-01-01  |
| 3        | c     | 2019-01-02  |
| 4        | d     | 2019-01-01  |
+----------+-------+-------------+

Поэтому я хочу получить только одну запись на ID, которая является самой последней записью.

Как мне добиться этого в SQL?

Спасибо тем, кто поможет!

Ответы [ 3 ]

5 голосов
/ 09 мая 2019

используйте row_number() для разбиения на Id и заказа на date desc

select *
from   (
          select *, rn = row_number() over (partition by [Id] order by [date] desc)
          from   yourtable
       ) d
where  d.rn = 1
2 голосов
/ 09 мая 2019

Мы также можем использовать подзапрос с GROUP BY MAX для каждого идентификатора, как показано ниже

Примечание: пожалуйста, не используйте ключевые слова в качестве названия столбца

declare @table as table(Id INT, [name] varchar(50), [date] date)
insert into @table values
(1,'a',     '2019-01-01'),
(1,'a2',    '2019-01-02'),
(2,'b',     '2019-01-01'),
(3,'c',     '2019-01-02'),
(3,'c2',    '2019-01-01'),
(4,'d',     '2019-01-01')

SELECT t.*
FROM @table t
INNER JOIN (SELECT id, MAX([date]) AS [date] FROM @table GROUP BY id) t1 ON t1.[date] = t.[date]
    AND t1.id = t.id
ORDER BY t.id

ВЫВОД:

Id  name    date
1   a2      2019-01-02
2   b       2019-01-01
3   c       2019-01-02
4   d       2019-01-01
0 голосов
/ 09 мая 2019

Вы также можете использовать GROUP BY ID и выбрать MAX(date), чтобы получить это:

SELECT a.Id, b.name, a.date
FROM
(SELECT Id, MAX(date) AS max_date FROM
 <your_table_name>
 GROUP BY Id) a
INNER JOIN
<your_table_name> b
ON
a.Id = b.Id AND
a.max_date = b.date
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...