Подходящий SQL Server подход для получения этих сгруппированных данных? - PullRequest
2 голосов
/ 21 сентября 2010

У меня есть таблица (AU_EMPLOYEE) с двумя столбцами с именами EmployeeID (int) и LastModifiedDate (DateTime). Наряду с этими столбцами находятся другие, содержащие дополнительные данные о сотрудниках. Это таблица аудита, и каждый раз, когда данные сотрудника каким-либо образом изменяются, добавляется новая строка.

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

Спасибо за предложения.

Ответы [ 4 ]

6 голосов
/ 21 сентября 2010

Вы можете использовать что-то вроде этого, чтобы показать самую последнюю строку для каждого сотрудника.Это хорошее применение для функции ROW_NUMBER.

    with ranking as 
    (
        select *, ROW_NUMBER() over(partition by EmployeeID order by LastModifiedDate desc) as rn
        from AU_EMPLOYEE
    )
    select * from ranking where rn = 1
3 голосов
/ 21 сентября 2010
SELECT <your columns>
FROM (
SELECT <your columns>,
ROW_NUMBER() OVER(PARTITION BY EmployeeID ORDER BY LastModifiedDate DESC) AS rn
) AS t
WHERE rn=1
3 голосов
/ 21 сентября 2010

Предполагая, по крайней мере, SQL 2005, чтобы вы могли использовать CTE :

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

;with cteMaxDate as (
    select EmployeeID, max(LastModifiedDate) as MaxDate
        from AU_EMPLOYEE
        group by EmployeeID
)
select e.EmployeeID, e.Column1, e.Column2, ...
    from cteMaxDate md
        inner join AU_EMPLOYEE e
            on md.EmployeeID= e.EmployeeID
                and md.MaxDate = e.LastModifiedDate
2 голосов
/ 21 сентября 2010

Ответ Криса Пеббла правильный, но более общее решение -

SELECT * FROM
(SELECT EmployeeID, LastModifiedDate
FROM AU_EMPLOYEE
WHERE LastModifiedDate<='X' ORDER BY LastModifiedDate Desc) A
GROUP BY A.EmployeeID

, где X - дата, к которой вы хотите вернуться вовремя.

...