SQL如何按但有特殊条件分组
我有一个SQL Server 2008表,其中有一个带有时间戳的员工列表 我有一个按员工日期分组的脚本 我需要的是按员工分组,但我必须排除同一天的时间戳,它们之间的差异小于8小时 下面是一个更好地解释的表格: 我用表和示例数据创建了一个SQL数据库 有线索吗 您真正想要的是滞后,即SQL Server 2012+中的滞后。使用lag,您将执行以下操作:SQL如何按但有特殊条件分组,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我有一个SQL Server 2008表,其中有一个带有时间戳的员工列表 我有一个按员工日期分组的脚本 我需要的是按员工分组,但我必须排除同一天的时间戳,它们之间的差异小于8小时 下面是一个更好地解释的表格: 我用表和示例数据创建了一个SQL数据库 有线索吗 您真正想要的是滞后,即SQL Server 2012+中的滞后。使用lag,您将执行以下操作: select t.* from (select t.*, lag(date) over (partition by EmployeeId ord
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;
您可能需要order by来维持相同的顺序。这也可以通过排除存在差异小于8小时的Previous row的行来实现:
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
您的示例看起来更像是order by,而不是group by。我使用第一个脚本得到NULL。在top 1查询中没有order by。我知道那是个意外。@VAAA。第一个不应该起作用,因为SQL Server 2008不支持滞后。我用order by修复了第二个问题。@OP:SQL Fiddle似乎正在运行SQL Server 2014,即使您选择了SQL Server 2008 select@@version。这可能就是为什么你会得到滞后的结果。
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