【发布时间】:2019-11-13 09:50:15
【问题描述】:
我有一个表,我正在尝试根据当前开始日期和前几行结束日期之间的日期差异创建一个 ID 字段
表格看起来像这样:
Table ID | Person ID | Start Date | End Date
1 | 1 | 01/01/2019 | 03/01/2019
2 | 1 | 03/01/2019 | 05/01/2019
3 | 1 | 07/01/2019 | 10/01/2019
4 | 1 | 10/01/2019 | 16/01/2019
4 | 1 | 16/01/2019 | 16/01/2019
5 | 1 | 18/01/2019 | 20/01/2019
我想要它做的是将当前行的开始日期与前一行的结束日期进行比较,如果差值大于 1,那么我们希望将 New ID 字段增加 1。如果它小于 1我们希望保持这个新字段与上一行相同(参见下面的示例)
Table ID | Person ID | Start Date | End Date | NEW ID Field
1 | 1 | 01/01/2019 | 03/01/2019 | 1
2 | 1 | 03/01/2019 | 05/01/2019 | 1
3 | 1 | 06/01/2019 | 10/01/2019 | 2
4 | 1 | 10/01/2019 | 16/01/2019 | 2
4 | 1 | 16/01/2019 | 16/01/2019 | 2
5 | 1 | 18/01/2019 | 20/01/2019 | 3
我目前必须这样做的代码一次更新整个表,而不是逐行更新,我想尽可能避免使用游标,因为这是一个相当大的表,会减慢我们的进程相当大的一块。
我现在的代码是:
DECLARE @rown INT
DECLARE @MAX INT
DECLARE @Val INT
SET @rown = 1
SET @max = (select count(*) from dbo.table)
SET @Val = 1
WHILE @rown <> @max
Update dbo.table
SET New_id_field =
(select Case WHEN LT_Flag = 0 then NULL
WHEN
DateDiffFromPrev *-1 >1
THEN @Val + 1
ELSE @Val
END)
FROM dbo.table t1
INNER JOIN
(
SELECT
table_ID
,person_ID
,start_date
,end_date
,LT_Flag
,ROW_NUMBER() OVER (PARTITION BY person_id ORDER BY start_date) AS rownumber
,DATEDIFF(day, start_date, coalesce(lag(end_date) over (partition by Person_ID, LT_Flag order by start_date), start_date)) as DateDiffFromPrev
FROM ) t2
ON t1.table_id = t2.table_id
SET @rown = @rown + 1
END
对帖子中的任何格式表示歉意,因为我是堆栈溢出的新手! 非常感谢提前
【问题讨论】:
-
对于描述 " 如果差值大于 1,那么我们希望将 New ID 字段增加 1。如果它小于 1" 那么当差是 1?
标签: sql sql-server database query-optimization