Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 重叠跨度_Sql_Sql Server 2008 R2_Overlapping - Fatal编程技术网

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