我有一个SQL Server 2008
表格,其中有timestamps
的员工列表。
我有一个脚本按员工分组日期。
我需要的是按员工分组,但我必须排除同一天的时间戳,而且它们之间的差异少于8小时。
这是一个更好地解释的表格:
我用表格和样本数据创建了一个SQL小提琴。
http://sqlfiddle.com/#!3/3b956/1
有任何线索吗?
答案 0 :(得分:2)
您真正想要的是lag()
,它位于SQL Server 2012+中。使用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
来维持相同的顺序。
答案 1 :(得分:0)
这也可以通过排除存在差异小于8小时的previuos行的行来实现:
select p1.employeeid, count(*) as [count]
from punch p1
where not exists(select * from punch p2
where p2.employeeid = p1.employeeid and p2.id < p1.id and
dateadd(hour, 8, p2.date) > p1.date)
group by p1.employeeid