Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/114.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 server 2008 r2 更新表格以避免日期重叠_Sql Server 2008 R2_Overlapping - Fatal编程技术网

Sql server 2008 r2 更新表格以避免日期重叠

Sql server 2008 r2 更新表格以避免日期重叠,sql-server-2008-r2,overlapping,Sql Server 2008 R2,Overlapping,我试图编写一个查询,围绕特定的跨度对日期范围进行重新排序。它应该做这样的事情 Member Rank Begin Date End Date 2275 A 9/9/14 11/17/14 2275 B 9/26/14 3/24/15 2275 B 3/25/15 12/31/15 8983 A 9/16/13 3/10/15 8983 B 2/24/15

我试图编写一个查询,围绕特定的跨度对日期范围进行重新排序。它应该做这样的事情

Member   Rank   Begin Date   End Date
2275     A      9/9/14       11/17/14
2275     B      9/26/14      3/24/15
2275     B      3/25/15      12/31/15
8983     A      9/16/13      3/10/15
8983     B      2/24/15      4/28/15
8983     A      4/28/15      12/31/15
它变成了什么

Member   Rank   Begin Date   End Date
2275     A      9/9/14       11/17/14
2275     B      11/18/14     3/24/15
2275     B      3/25/15      12/31/15
8983     A      9/16/13      3/10/15
8983     B      3/11/15      4/27/15
8983     A      4/28/15      12/31/15
为了进一步解释,我希望更新日期。除了A>B之外,排名没有太多变化。只有A和B。排名为A的日期范围应该保持不变。重叠的日期是可以的。我关注的是B级日期与A级日期重叠。该表非常大,有700个成员,并且有几个不同的成员ID。2275成员的第二行B将开始日期更改为2015年11月18日,以避免与第一行重叠

我正在使用Microsoft SQL Server 2008 R2


感谢最新编辑:以下是我在2012年之前所做的。我认为这不是最优雅的解决方案

WITH a AS (
    SELECT
        1 AS lgoffset
        , NULL AS lgdefval
        , ROW_NUMBER() OVER(PARTITION BY [Member] ORDER BY [Begin Date]) AS seq
        , [Member]
        , [Rank]
        , [Begin Date]
        , [End Date]
    FROM #table 
)
SELECT
    a.seq
    , a.[Member]
    , a.[Rank]
    , a.[Begin Date]
    , CASE
        WHEN a.[Rank] = 'B' AND a.[Begin Date] <= ISNULL(aLag.[End Date], a.lgdefval)
        THEN ISNULL(aLag.[End Date], a.lgdefval)
        ELSE a.[Begin Date]
      END AS bdate2
    , a.[End Date]
INTO #b
FROM a
LEFT OUTER JOIN a aLag
    ON a.seq = aLag.seq + a.lgoffset
    AND a.[Member] = aLag.[Member]
ORDER BY [Member], [Begin Date];


UPDATE #table
SET #table.bdate = CASE
                    WHEN #table.rnk = 'B' AND #table.bdate <= (SELECT #b.bdate2 FROM #b WHERE #b.bdate2 > #b.bdate and #table.mbr = #b.mbr)
                    THEN dateadd(d, 1,(SELECT bdate2 FROM #b WHERE #b.bdate2 > #b.bdate and #table.mbr = #b.mbr )) 
                    ELSE #table.bdate
                    END  
编辑:为了更新开始日期列:

UPDATE #Table
SET [Begin Date] = (SELECT
                    CASE
                        WHEN [Rank] = 'B' AND [Begin Date] <= LAG([End Date],1,'12/31/2030') OVER(PARTITION BY [Member] ORDER BY [Begin Date]) 
                        THEN DATEADD(d,1,LAG([End Date],1,'12/31/2030')OVER(PARTITION BY [Member] ORDER BY [Begin Date]))
                        ELSE [Begin Date]
                      END AS [Begin Date]
                    FROM #Table)
编辑2:我的一些代码不正确,因为没有实现需要OVER语句、updated select语句和update语句的lag函数

资料来源:


最新编辑:以下是我在2012年之前所做的。我认为这不是最优雅的解决方案

WITH a AS (
    SELECT
        1 AS lgoffset
        , NULL AS lgdefval
        , ROW_NUMBER() OVER(PARTITION BY [Member] ORDER BY [Begin Date]) AS seq
        , [Member]
        , [Rank]
        , [Begin Date]
        , [End Date]
    FROM #table 
)
SELECT
    a.seq
    , a.[Member]
    , a.[Rank]
    , a.[Begin Date]
    , CASE
        WHEN a.[Rank] = 'B' AND a.[Begin Date] <= ISNULL(aLag.[End Date], a.lgdefval)
        THEN ISNULL(aLag.[End Date], a.lgdefval)
        ELSE a.[Begin Date]
      END AS bdate2
    , a.[End Date]
INTO #b
FROM a
LEFT OUTER JOIN a aLag
    ON a.seq = aLag.seq + a.lgoffset
    AND a.[Member] = aLag.[Member]
ORDER BY [Member], [Begin Date];


UPDATE #table
SET #table.bdate = CASE
                    WHEN #table.rnk = 'B' AND #table.bdate <= (SELECT #b.bdate2 FROM #b WHERE #b.bdate2 > #b.bdate and #table.mbr = #b.mbr)
                    THEN dateadd(d, 1,(SELECT bdate2 FROM #b WHERE #b.bdate2 > #b.bdate and #table.mbr = #b.mbr )) 
                    ELSE #table.bdate
                    END  
编辑:为了更新开始日期列:

UPDATE #Table
SET [Begin Date] = (SELECT
                    CASE
                        WHEN [Rank] = 'B' AND [Begin Date] <= LAG([End Date],1,'12/31/2030') OVER(PARTITION BY [Member] ORDER BY [Begin Date]) 
                        THEN DATEADD(d,1,LAG([End Date],1,'12/31/2030')OVER(PARTITION BY [Member] ORDER BY [Begin Date]))
                        ELSE [Begin Date]
                      END AS [Begin Date]
                    FROM #Table)
编辑2:我的一些代码不正确,因为没有实现需要OVER语句、updated select语句和update语句的lag函数

资料来源:


是的,我正在使用一个更新查询,但是我发现很难单独隔离每个成员更新表集合begindate=DATEADDd,1,从表b中选择b.enddate,其中b.rank='A'和b.begindate