Sql server 是否使用适当的SQL Server方法检索此分组数据?

Sql server 是否使用适当的SQL Server方法检索此分组数据?,sql-server,select,group-by,Sql Server,Select,Group By,我有一个表AU_EMPLOYEE,其中有两列名为EmployeeID int和LastModifiedDate DateTime。除了这些列之外,还有其他包含其他员工数据的列。这是一个审核表,每次员工的数据以某种方式更改时,都会添加一个新行 因此,一个给定的员工很可能在这个表中有多行。我想检索由LastModifiedDate确定的每个员工的最新记录。做这件事的好方法是什么?嵌套查询还是类似于这些行的东西 感谢您的建议。假设至少有SQL 2005,那么您可以使用: 编辑:正如我在过去指出的,一定

我有一个表AU_EMPLOYEE,其中有两列名为EmployeeID int和LastModifiedDate DateTime。除了这些列之外,还有其他包含其他员工数据的列。这是一个审核表,每次员工的数据以某种方式更改时,都会添加一个新行

因此,一个给定的员工很可能在这个表中有多行。我想检索由LastModifiedDate确定的每个员工的最新记录。做这件事的好方法是什么?嵌套查询还是类似于这些行的东西


感谢您的建议。

假设至少有SQL 2005,那么您可以使用:

编辑:正如我在过去指出的,一定要测试性能。使用MAX的CTE版本通常会优于基于行数的解决方案

;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

您可以使用类似这样的内容来显示每个员工最近的行。这是行数函数的一个很好的用法

    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

Chris Pebble的答案是正确的 然而,更普遍的解决办法是

SELECT * FROM (SELECT EmployeeID, LastModifiedDate FROM AU_EMPLOYEE WHERE LastModifiedDate<='X' ORDER BY LastModifiedDate Desc) A GROUP BY A.EmployeeID
其中X是您希望返回的日期。

对于频繁的修改,每个员工可以得到多行频繁间隔不到一秒?我假设你指的是精度的四舍五入到.000、.003、.007?如果没有,请进一步解释。是的,更新可能间隔不到一秒钟。我们甚至在DB2上发生了一些冲突,精度是微秒,而不是3毫秒。我认为这将导致一个错误,因为LastModifiedDate不是group by的一部分,也不在aggergate函数中使用。更不用说派生表没有分配别名。添加别名谢谢。它确实有效,因为您希望按员工ID对其进行分组,并删除小于“X”的日期。降序使得分组后保留的最后修改日期是最大的日期。它有效,我用它,恐怕不行。Msg 1033,级别15,状态1,第4行ORDER BY子句在视图、内联函数、派生表、子查询和公共表表达式中无效,除非还指定了TOP或FOR XML。修复后,我得到消息8120,级别16,状态1,第1行列“A.LastModifiedDate”在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。在SQL Server中,当使用分组依据时,您不能在选择列表中包含项目,除非该项目位于分组依据中或在诸如MAX、MIN、SUM等聚合函数中。您没有意识到SQL Server属于MSSQL。可以与MySQL一起使用,但在这一点上并不重要。MSSQL=MicroSoft SQL=SQL Server感谢您的回复,非常感谢。 SELECT * FROM (SELECT EmployeeID, LastModifiedDate FROM AU_EMPLOYEE WHERE LastModifiedDate<='X' ORDER BY LastModifiedDate Desc) A GROUP BY A.EmployeeID