我有一个 SQL Server 2008
表,其中包含带有时间戳
的员工列表。
我有一个按员工日期分组的脚本。
我需要的是按员工分组,但我必须排除同一天的时间戳,并且它们之间的差异小于 8 小时。
这里有一个表格可以更好地解释:
我使用表和示例数据创建了一个 SQL Fiddle。
http://sqlfiddle.com/#!3/3b956/1
Any clue?
最佳答案
您真正想要的是 SQL Server 2012+ 中的 lag()
。使用 lag()
,您可以:
select t.*
from (select t.*, lag(date) over (partition by EmployeeId order by date) as prev_date
from t
) t
where not (cast(prev_date as date) = cast(date as date) and
date <= dateadd(hour, 8, prev_date)
) or
prev_date is null;
在 SQL Server 2008 中,您可以使用 outer apply
执行类似的操作:
select t.*
from t outer apply
(select top 1 prev.*
from t prev
where prev.Employee_id = t.EmployeeId and
prev.date < t.date and
cast(prev.date as date) = cast(t.date as date)
order by prev.date desc
) prev
where prev.date is null or
t.date > dateadd(hour, 8, prev.date);
您可能需要一个order by
来维持相同的顺序。
关于SQL如何按特殊条件进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33585244/