Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL如何按但有特殊条件分组_Sql_Sql Server_Sql Server 2008 - Fatal编程技术网

SQL如何按但有特殊条件分组

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

我有一个SQL Server 2008表,其中有一个带有时间戳的员工列表

我有一个按员工日期分组的脚本

我需要的是按员工分组,但我必须排除同一天的时间戳,它们之间的差异小于8小时

下面是一个更好地解释的表格:

我用表和示例数据创建了一个SQL数据库

有线索吗

您真正想要的是滞后,即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;

您可能需要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