enter image description here

我正在试图找到一种方法来迭代一些按时间顺序排列的数据,并在此过程中应用某些参数.我有一个包含事件编号的表,这些编号与客户在事件发生后收到的每个后续服务(按日期顺序)相关联.起初,我使用分区代码,并将最早的Sequel Service作 for each 事件的最终续集,但后来我被告知,一个事件的完整结果可以包含多个服务,前提是这些服务的间隔不超过3天.因此,我现在需要一些代码来处理时间顺序,并找到与每个事件相关的每个服务集群.

因此,对于事件1:第一次服务是在活动结束后的第二天提供的,并于2022年1月16日结束.服务2随后在两天后开始,因此也在范围内,服务3在服务2结束后的第二天开始,因此需要包括在内,但在客户收到第四项服务之前有两个月的间隔,因此这将被视为与事件1无关.

"In Scope"列是我想要创建的,允许我将每个事件及其相关的后续服务移动到一个新表中,而不考虑其余的.有没有办法使用循环或其他功能自动执行此过程?在处理完事件1之后,代码需要依次移到事件2、事件3、事件4等上,以找到相关的服务集群.

构建上述表格的代码:

create table #Table
(Event_Number int
,Event_Start date
,Event_End date
,Sequel_Service_Number int
,Sequel_Service_Start_Date date
,Sequel_Service_End_Date date
,In_Scope Int
)

insert into #Table
(Event_Number
,Event_Start
,Event_End
,Sequel_Service_Number
,Sequel_Service_Start_Date
,Sequel_Service_End_Date
,In_Scope
)
values
(1, '2022-01-01', '2022-01-10', 1, '2022-01-11', '2022-01-16', 1)
,(1, '2022-01-01', '2022-01-10', 2, '2022-01-18', '2022-01-25', 1)
,(1, '2022-01-01', '2022-01-10', 3, '2022-01-26', '2022-01-30', 1)
,(1, '2022-01-01', '2022-01-10', 4, '2022-03-31', '2022-04-05', 0)
,(2, '2022-03-20', '2022-03-30', 1, '2022-03-31', '2022-04-05', 1)
,(2, '2022-03-20', '2022-03-30', 2, '2022-04-08', '2022-04-12', 1)
,(2, '2022-03-20', '2022-03-30', 3, '2023-01-01', '2023-01-30', 0)
,(2, '2022-03-20', '2022-03-30', 4, '2023-02-01', '2023-02-06', 0)
,(2, '2022-03-20', '2022-03-30', 5, '2023-04-05', '2023-04-12', 0)
,(2, '2022-03-20', '2022-03-30', 6, '2023-05-09', '2023-05-10', 0)
,(2, '2022-03-20', '2022-03-30', 7, '2023-05-10', '2023-05-15', 0)
; 

推荐答案

您可以使用LAG函数来判断服务开始日期和前一个服务结束日期之间的差值是否大于3,如果是,则设置0,如果不是,则设置1.然后,使用运行MIN函数来获得所需的输出,(一旦差值超过3天,标志设置为0,运行MIN将其余设置为0).

WITH check_gap AS
(
  SELECT *,
    CASE WHEN 
     DATEDIFF(
       DAY, 
       LAG(Sequel_Service_End_Date) OVER (PARTITION BY Event_Number ORDER BY Sequel_Service_Start_Date) , 
       Sequel_Service_Start_Date
     ) > 3 THEN 0 ELSE 1 END AS flag
  FROM #Table
)
SELECT Event_Number, 
       Event_Start, 
       Event_End, 
       Sequel_Service_Number, 
       Sequel_Service_Start_Date, 
       Sequel_Service_End_Date,
       MIN(flag) OVER (PARTITION BY Event_Number ORDER BY Sequel_Service_Start_Date) AS In_Scope
FROM check_gap
ORDER BY Event_Number, Sequel_Service_Start_Date

Demo

Sql相关问答推荐

SQL基于多个值 Select 单行

如何在PostgreSQL中对第1,1,1,1,2,2,2,2行进行编号

从依赖于其他表的值的XREF表中的值分组获得正确的计数?

使用generate_series()时,LEFT联接缺少日期/间隔

对于多字节字符,SQL Server中的DATALENGTH返回1字节

明细表中没有记录如何更新主表的值为0

在SQL中,筛选其他列中只有一个值的ID

如何用HeidiSQL在Firebird中设置超时?

从重复值中获取最新值

将SQL Server查询改进为;线程安全;

输出连续出现两次以上的行

在 PostgreSQL 中使用 ltree 列进行累积

在presto sql中解析带有区域的时间格式

SQL:考虑合并分支计算分支的增长百分比

正则表达式:停在第一个匹配的其中一个字符位置上

多列上的 SQL UNIQUE 约束 - 它们的组合必须是唯一的还是至少其中之一?

如何使用 pg-promise 创建要在复杂的 sql 查询中使用的 VALUES 列表?

使用 JSON_BUILD_OBJ 从 Postgres 返回 JSON

SQL Group By 然后映射出是否存在值

在 MindsDB SQL 编辑器中运行 PostgreSQL 条目 ID 时出现未知 Select 目标错误