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

标签 sql sql-server sql-server-2008

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

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

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

这里有一个表格可以更好地解释:

enter image description here

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

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

Any clue?

最佳答案

您真正想要的是 SQL Server 2012+ 中的 lag()。使用 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来维持相同的顺序。

关于SQL如何按特殊条件进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33585244/

相关文章:

sql-server - 删除 SQL 行,忽略所有外键和约束

mysql - 如果已给出所有成分,则显示食谱名称

java - Type1 中的 SQL 语法 : java jdbc odbc bridge

sql-server - 基于SQL Server 2012中的列选择具有正态分布的随机行

c# - 如何使用 C# 可靠地确定安装了哪些 SQL Server 2008 组件?

sql - 使用 rand() 函数用随机 9 位数字更新多行

sql-server - 从 getdate() 中提取日期格式

sql - 客户位置与 hive 中POI之间的距离

sql oracle - 选择日期之间的可用性

sql-server-2008 - 从链接存储过程插入到本地表