2010-09-21 99 views
2

我有一个表(AU_EMPLOYEE)有两列名为EmployeeID(int)和LastModifiedDate(DateTime)。与这些列一起包含其他员工数据。这是一个审计表,每当员工的数据以某种方式更改时添加一个新行。适用于检索此分组数据的SQL Server方法?

因此,很可能给定的员工在此表中有多行。我想检索LastModifiedDate确定的每个员工的最新记录。这样做的好方法是什么?嵌套查询或沿着这些行的东西?

感谢您的建议。

回答

6

您可以使用类似的东西来显示每个员工的最近行。这对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 
+1

+1,我该怎么做 – 2010-09-21 19:49:31

+0

感谢您的所有答复 - 非常感谢。 – larryq 2010-09-21 20:40:52

3

假设至少是SQL 2005,所以你可以使用一个CTE

编辑:正如我已经指出herehere过去,一定要测试性能。 MAX的CTE版本通常会胜过基于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 
+0

对于频繁修改,您可以获得每位员工多于一行 – 2010-09-21 19:40:14

+1

频繁被隔开不到一秒?我假设你指的是将[DateTime](http://msdn.microsoft.com/zh-cn/library/ms187819.aspx)的精度舍入为.000,.003,.007?如果不是,请进一步解释。 – 2010-09-21 19:46:17

+0

可能会发生更新,“间隔不到一秒钟”。我们甚至在DB2上发生了一些冲突,其中精度以微秒为单位,而不是3毫秒。 – 2010-09-21 20:25:48

3
SELECT <your columns> 
FROM (
SELECT <your columns>, 
ROW_NUMBER() OVER(PARTITION BY EmployeeID ORDER BY LastModifiedDate DESC) AS rn 
) AS t 
WHERE rn=1 
2

克里斯卵石的答案是正确 然而一个更通用的解决方案是

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

其中X是要回到过去的日期。

+0

我认为这会导致错误,因为'LastModifiedDate'不是'group by'的一部分或者用在aggergate函数中。更不用说派生表没有为其分配别名。 – 2010-09-21 19:52:08

+0

添加别名谢谢。它可以工作,因为您想通过员工ID对其进行分组,并修剪小于'X'的日期。降序排列使得LastModified日期在分组最大之后保持不变。它工作,我使用它。 – mna 2010-09-21 19:59:33

+0

恐怕不是。 '消息1033,级别15,状态1,行4除非还指定了TOP或FOR XML,否则ORDER BY子句在视图,内联函数,派生表,子查询和公用表表达式中无效。消息8120,级别16,状态1,行1列'A.LastModifiedDate'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。“在SQL Server中使用GROUP BY时,您除非它在GROUP BY中或像MAX(),MIN(),SUM()等aggergate函数中,否则不能在选择列表中包含项目。 – 2010-09-21 20:15:19