SQL如何按特殊条件进行分组

时间:2015-11-07 16:50:50

标签: sql sql-server sql-server-2008

我有一个SQL Server 2008表格,其中有timestamps的员工列表。

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

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

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

enter image description here

我用表格和样本数据创建了一个SQL小提琴。

http://sqlfiddle.com/#!3/3b956/1

  

有任何线索吗?

2 个答案:

答案 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