我有一个df告诉用户位置。
ID date_start date_end location
-------------------------------------------------------
1 2020-01-30 2020-03-25 Office 2
1 2010-03-26 2020-04-30 Office 1
1 2010-06-01 2010-08-01 Home and so on
2 2010-07-01 2010-09-03 Office 4
4 2010-06-01 2010-07-23 Office 5
4 2010-07-24 2010-07-31 Home
5 2010-07-01 2010-07-23 Office 1
5 2010-07-24 2010-07-31 Office 2
我需要找出那些在某个特定时间段(比如整个2010年7月)在任何办公地点不在家的人。怎么做?这是为了追踪说人们是否真的在办公室工作。
预期结果:
ID date_start date_end location
--------------------------------------------------
2 2010-07-01 2010-09-03 Office 4
5 2010-07-01 2010-07-23 Office 1
5 2010-07-24 2010-07-31 Office 2
解释
一号身份证2010年7月在家,所以他来不了。
身份证2在4号办公室
身份证4号在2010年7月在家呆了一段时间,所以他也来不了
5号身份证在不同的办公室,但整个7月都在办公室,所以他成功了
3条答案
按热度按时间deyfvvtc1#
与
NOT EXISTS
:请看演示。
结果:
mm9b1k5b2#
通过使用日期逻辑,您可以看到2010年7月任何一天的重叠。以下是7月份的所有记录:
下一步,聚合:
这个
having
条款检查他们一个月内根本不在家,至少一次不在办公室。编辑:
如果需要原始行,则使用
not exists
:vwkv1x7d3#
这种方法使用一个日期范围tvf(表值函数)来生成每个id在不同办公地点出现的不同日期。然后,它使用相同的tvf按天生成比较间隔。然后它按天加入,其中匹配的计数等于比较间隔中的天数(包括天数)。日期范围函数来自以下脚本:https://www.sqlservercentral.com/scripts/a-daterange-table-valued-function
最后,查询匹配回原始表,以选择比较范围中包含日期的行。