首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL如何按但有特殊条件进行分组

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

Stack Overflow用户
提问于 2015-11-07 16:50:49
回答 2查看 54关注 0票数 2

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

我有一个脚本,它按照员工的日期分组。

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

以下是一张解释得更好的表格:

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

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

有线索吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-07 16:57:32

您真正需要的是lag(),它位于Server 2012+中。使用lag(),您可以这样做:

代码语言:javascript
复制
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;

在Server 2008中,您可以使用outer apply执行类似的操作

代码语言:javascript
复制
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来维持相同的顺序。

票数 2
EN

Stack Overflow用户

发布于 2015-11-07 17:34:36

这还应排除存在差异小于8小时的先前行的行:

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33585244

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档