关于从两列获取具有最大日期的记录的SQL查询

问题描述 投票:0回答:2

我有一个这样的SQL Server表:

EMPs

Id  Name    DateOn              DateOff     
-------------------------------------------------
1   EMP1    2020-9-4 12:00 AM   NULL
2   EMP1    2020-9-4 12:00 AM   2020-9-4 10:00 PM
3   EMP2    2020-7-4 12:00 AM   NULL
4   EMP4    2020-7-4 12:00 AM   2020-9-4 10:00 PM

带有查询的另一个示例声明@EMP表(ID INT,名称VARCHAR(200),AlarmOnTimeStamp DATETIMEOFFSET,AlarmOffTimeStamp DATETIMEOFFSET NULL);

插入@EMP值(1,'Test1','2020-04-09 01:56:29.507',NULL)插入@EMP值(2,'Test1','2020-04-09 01:56:29.507','2020-04-09 03:56:29.507')插入@EMP值(3,'Test2','2020-04-09 01:56:29.507','2020-04-09 03:56:29.507')

[选择 *,row_number()结束(按a.AlarmOffTimestamp desc排序)rn来自@EMP a)a,其中rn = 1

enter image description here

[Id列是唯一的。

我想要一个SQL查询,像上面的例子那样获得单个记录,我应该得到Id => 2,3和第4个记录;我很困惑如何将两列最大日期与group by语句一起使用。

sql sql-server tsql greatest-n-per-group
2个回答
0
投票

我认为在这种情况下,简单的row_number()函数应该不错:

select * from (
    select *,
           row_number() over (order by DateOff desc) rn
    from myTable
) a where rn = 1

就性能而言,您可以在用于排序和过滤结果集的列上定义索引,在这种情况下,DateOff用于排序,因此它很适合作为索引。


0
投票

您可以使用子查询进行过滤:

select e.*
from emps e
where t.id = (
    select top (1) id 
    from emps e1
    where e1.name = e.name 
    order by e1.dateon, e1.dateoff
)

尚不清楚您想要什么排序标准;这将为您提供最早的dateon记录;如果有关系,则使用dateoff打破关系。您可能想要根据您的确切要求来适应子查询的order by子句。

即使对于大型数据集,此解决方案通常也非常有效。为了提高性能,您需要在(name, dateon, dateoff)上加一个索引。您也可以尝试在索引的最后位置添加id,例如(name, dateon, dateoff, id):这使inde covering,这意味着数据库仅通过查看索引就可以执行子查询。 >

© www.soinside.com 2019 - 2024. All rights reserved.