Выбрать отдельную строку с максимальной датой из таблицы SQL Server?
-
03-07-2019 - |
Вопрос
Мне нужно получить набор отдельных записей для таблицы вместе с максимальной датой для всех дубликатов.
бывший:
Select distinct a,b,c, Max(OrderDate) as maxDate
From ABC
Group By a,b,c
Проблема в том, что я получаю запись для каждой даты.
Бывший:
aaa, bbb, ccc, Jan 1 2009
aaa, bbb, ccc, Jan 28 2009
Как я могу ограничить это, чтобы в итоге у меня было только:
aaa, bbb, ccc Jan 28 2009
Я предполагаю, что проблема в том, что группа явно не ладит друг с другом.
РЕДАКТИРОВАТЬ:Обнаружена проблема, вызвавшая проблему, результаты запроса оказались такими, как ожидалось, а не такими, как указано выше.
Решение
Что-то не так либо с вашим запросом, либо с результатами вашего примера, поскольку то, что вы описываете, не должно быть возможным.Как насчет реального SQL и реальных результатов?
В любом случае вам не нужно distinct
там, поскольку все, что вы выбираете, — это три сгруппированных столбца и совокупность, поэтому по определению вы получите все отдельные строки.Я никогда этого не пробовал, так что, возможно, при использовании обоих из них есть какие-то неправильные действия.Вы пытались удалить distinct
?Что заставило вас положить это туда?
Другие советы
WITH q AS (
SELECT abc.*, ROW_NUMBER() OVER (PARTITION BY a, b, c ORDER BY orderDate DESC) AS rn
FROM abc
)
SELECT *
FROM q
WHERE rn = 1
Наличие индекса на (a, b, c, orderDate)
(в этом порядке) значительно улучшит этот запрос.
Если вы запустите этот запрос:
select 'ab' as Col1, 'bc' as col2, 'cd' as col3, getdate() as Date
into #temp
insert into #temp
values ('ab','bc','cd','1/15/09')
insert into #temp
values ('aa','bb','cc','1/1/09')
insert into #temp
values ('aa','bb','cc','1/22/09')
select col1,col2,col3,max(date)
from #temp
group by col1,col2,col3
Вы должны вернуться:
аа, bb, cc, 2009-01-22 00:00:00.000
ab, bc, cd, 2009-04-30 09:23:07.090
Ваш запрос тоже будет работать, значит, что-то действительно не так, или вы неправильно сообщили точную природу своего кода.