如果不同协议的protocol_opening_date相隔15天之内,我需要在另一列中将它们作为一种协议显示在一个名为“预期开始日期”的列中。
我不知道如何在这里复制表格,但我会尽力解释。
因此,假设一个协议的开始日期为24.01.2018,结束日期为30.01.2018,另一协议的开始日期为25.01.2018,结束日期为10.02.2018
我需要将它们显示为不同的协议,起始日期为24.01,结束日期为10.02,因为它们之间的间隔为15天。
另一个大问题是,我不知道如何将这两个协议与第三个或第四个协议进行比较。因为即使在同一日期间隔中有两个以上的协议,我也不知道如何将它们相互比较。
编辑:我添加了表格的一部分,相同的颜色是被组合成一个协议的协议。 Beklenen_baslangıc==预期开始日期
答案 0 :(得分:1)
如注释中所述,您可以使用LAG
函数。基本思想是为每行分配一个0/1值:如果它在上一行的15天之内,则返回0,否则为1。然后使用SUM() OVER ()
将1和0转换为可用于分组的数字
请注意,这可以将更长的日期范围分组在一起,例如尽管开始日期和最后日期相隔15天以上,但01-01
,01-11
,01-21
,02-01
和02-11
将被分组在一起。
DECLARE @T TABLE (HASTA_ID INT, PROTOKOL_ID INT, STARTDATE DATE, ENDDATE DATE);
INSERT INTO @T VALUES
(273065, 11, '2018-01-24', '2018-01-30'),
(273065, 12, '2018-01-25', '2018-02-10'),
(273065, 13, '2018-01-30', '2018-01-30'),
(273065, 14, '2018-02-23', '2018-02-28'),
(273065, 15, '2018-03-21', '2018-03-29'),
(273065, 16, '2018-05-03', '2018-05-04'),
(273065, 17, '2018-05-03', '2018-05-08'),
(273065, 18, '2018-05-14', '2018-05-22'),
(273065, 19, '2018-05-22', '2018-05-23'),
(273065, 20, '2018-09-20', '2018-09-30');
WITH CTE1 AS (
SELECT *, CASE WHEN LAG(STARTDATE) OVER (PARTITION BY HASTA_ID ORDER BY STARTDATE) >= DATEADD(DAY, -14, STARTDATE) THEN 0 ELSE 1 END AS CHG
FROM @T
), CTE2 AS (
SELECT *, SUM(CHG) OVER (PARTITION BY HASTA_ID ORDER BY STARTDATE) AS GRP
FROM CTE1
)
SELECT *,
MIN(STARTDATE) OVER (PARTITION BY HASTA_ID, GRP) AS EX_STARTDATE,
MAX(ENDDATE) OVER (PARTITION BY HASTA_ID, GRP) AS EX_ENDDATE
FROM CTE2
ORDER BY HASTA_ID, STARTDATE