假设我有一个表,具有以下结构的以下数据。我正在尝试查询数据,以查找某人(员工(工作的日期范围。
NAME WORKED DATE
Bob YES 1/1/2019
Bob YES 1/2/2019
Bob YES 1/3/2019
Bob NO 1/4/2019
Bob YES 1/5/2019
Bob YES 1/6/2019
Bob NO 1/7/2019
Jane Yes 1/1/2019
Jane Yes 1/2/2019
Jame No 1/3/2019
预期结果:(我需要的结果(
Bob 1/1/2019 - 1/3/2019
Bob 1/5/2019 - 1/6/2019
Jane 1/1/2019 - 1/2/2019
返回此结果集的查询的SQL语法(SQL Server 2008+(是什么
thx提前
这是一个缺口和孤岛问题。您可以使用row_number()
和一些日期运算来识别这些行。
所以,假设你每个日期都有一行:
select name, min(date), max(date)
from (select t.*,
row_number() over (partition by name order by date) as seqnum
from t
where worked = 'YES'
) t
group by name,
dateadd(day, - seqnum, date);
为什么这样做?您正在查找相邻的日期。如果从日期中减去一个序列,那么结果是恒定的——当日期是连续的时。此观察结果在group by
中用于获取所需的组。