Sql 重叠跨度
我试图编写一个查询,围绕特定的跨度对日期范围进行重新排序。它应该做这样的事情Sql 重叠跨度,sql,sql-server-2008-r2,overlapping,Sql,Sql Server 2008 R2,Overlapping,我试图编写一个查询,围绕特定的跨度对日期范围进行重新排序。它应该做这样的事情 Row Rank Begin Date End Date 1 B 3/24/13 11/1/13 2 A 10/30/13 4/9/15 3 B 3/26/15 12/31/15 它变成了什么 Row Rank Begin Date End Date 1 B 3/24/13 10/29
Row Rank Begin Date End Date
1 B 3/24/13 11/1/13
2 A 10/30/13 4/9/15
3 B 3/26/15 12/31/15
它变成了什么
Row Rank Begin Date End Date
1 B 3/24/13 10/29/13
2 A 10/30/13 4/9/15
3 B 4/10/15 12/31/15
为了进一步解释,第2行中的日期排名较高(A>B),因此第1行和第3行中的日期必须围绕第2行中的日期进行更改,以避免日期重叠
我正在使用SQL Server 2008 R2请使用下面的查询更新表
Update table_name
set End_Date = DATEADD(day, -1, select Begin_Date from Table_name where
Row_number = '2')
where row = 1;
每次运行查询时都需要更改行号。让我知道这是否适合你
我建议首先创建一个视图
CREATE OR REPLACE VIEW tempview AS
SELECT row, begin_date FROM table_name
WHERE row > 1;
然后使用此查询更新所有行。If可能不会仅更新第一行
Update table_name
set End_Date = DATEADD(day, -1, select Begin_Date from tempview)
希望这能起作用您可以使用以下查询:
;WITH CTE AS (
SELECT Row, Rank, BeginDate, EndDate,
ROW_NUMBER() OVER (ORDER BY BeginDate) AS rn
FROM mytable
), ToUpdate AS (
SELECT c1.Row, c1.Rank, c1.BeginDate, c1.EndDate,
c2.Rank AS pRank, c2.EndDate AS pEndDate,
c3.Rank AS nRank, c3.BeginDate AS nBeginDate
FROM CTE AS c1
LEFT JOIN CTE AS c2 ON c1.rn = c2.rn + 1
LEFT JOIN CTE AS c3 ON c1.rn = c3.rn - 1
WHERE c1.Rank = 'B'
)
UPDATE ToUpdate
SET BeginDate = CASE
WHEN pEndDate IS NULL
THEN BeginDate
WHEN (pEndDate >= BeginDate) AND (pRank = 'A')
THEN DATEADD(d, 1, pEndDate)
ELSE BeginDate
END,
EndDate = CASE
WHEN nBeginDate IS NULL
THEN EndDate
WHEN (nBeginDate <= EndDate) AND (nRank = 'A')
THEN DATEADD(d, -1, nBeginDate)
ELSE EndDate
END
用于与以前的记录连接在一起,而此记录:
LEFT JOIN CTE AS c3 ON c1.rn = c3.rn - 1
用于与下一条记录连接在一起
使用CASE
表达式,我们现在可以很容易地识别重叠,并在有重叠的情况下执行更新
您的意思是您正在使用SQL Server吗?请用RDBMS标记您的问题。另外,你只是在寻找合并日期的帮助,还是你的问题还有更多?我们需要了解您的排名吗?是的,我使用的是SQL Server 2008 R2。我希望更新日期。不,除了A>B之外,排名没有太多。只有A和B。排名为A的日期范围应该保持不变。如果您有两个连续的
'B'
排名记录,日期重叠怎么办?重叠的B排名日期是可以的。我关心的是B级日期与A级日期重叠。谢谢,这确实有效。然而,我希望在一个非常大的数据集(700行)上应用它,所以我想要更自动化的东西。
LEFT JOIN CTE AS c3 ON c1.rn = c3.rn - 1