Выбрать отдельную строку с максимальной датой из таблицы SQL Server? - PullRequest
2 голосов
/ 30 апреля 2009

Мне нужно получить набор отдельных записей для таблицы вместе с максимальной датой для всех дубликатов.

например:

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

Полагаю, проблема в том, что группа не очень хорошо ладит.

РЕДАКТИРОВАТЬ: обнаружена проблема, которая вызывала проблему, результаты запроса были, как ожидалось, а не как указано выше.

Ответы [ 3 ]

4 голосов
/ 30 апреля 2009

Что-то не так с вашим запросом или результатами вашего примера, так как то, что вы описываете, не должно быть возможным. Как насчет реального SQL и реальных результатов?

В любом случае вам не нужно distinct, поскольку все, что вы выбираете, это ваши три сгруппированных столбца и агрегат, так что вы по определению получите все отдельные строки. Я никогда не пробовал это, так что, возможно, есть некоторые плохое поведение при использовании обоих из них. Вы пытались удалить distinct? Что заставило вас положить его туда?

3 голосов
/ 30 апреля 2009
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) (в этом порядке) значительно улучшит этот запрос.

1 голос
/ 30 апреля 2009

Если вы выполните этот запрос:

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

Вы должны вернуться:

aa, bb, cc, 2009-01-22 00: 00: 00.000
ab, bc, cd, 2009-04-30 09: 23: 07.090

Ваш запрос также будет работать, поэтому что-то действительно не так, или вы не указали точный характер вашего кода

...