我有一个这样的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
[Id
列是唯一的。
我想要一个SQL查询,像上面的例子那样获得单个记录,我应该得到Id => 2,3和第4个记录;我很困惑如何将两列最大日期与group by语句一起使用。
我认为在这种情况下,简单的row_number()
函数应该不错:
select * from (
select *,
row_number() over (order by DateOff desc) rn
from myTable
) a where rn = 1
就性能而言,您可以在用于排序和过滤结果集的列上定义索引,在这种情况下,DateOff
用于排序,因此它很适合作为索引。
您可以使用子查询进行过滤:
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,这意味着数据库仅通过查看索引就可以执行子查询。 >