使用同一个表修复表中的数据不正确

表位置(LocId,StartDt,EndDt)具有不正确的EndDt。 第二个表格是它应该看起来的样子。 位置表在产品Db中。 我正在使用MS SQL Server

位置
LocId StartDt EndDT
2015年1月1日 - 23日至2015年12月31日
2015年2月1日 - 15日至2015年12月31日
2015年3月2日 - 18日至2015年4月28日
2 Nov-23-2015 Dec-31-9999
2015年7月2日 - 23 - 2015年11月23 - 2015年
4月2日 - 28日至2015年12月31日


这就是决赛桌应该如何看待下面的情况
位置
LocId StartDt EndDT
2015年1月1日至23日2015年2月15日
2015年2月1日 - 15日至2015年12月31日
2015年3月2日 - 18日至2015年4月28日
4月2日 - 2015年7月23日 - 2015年7月
2015年7月2日 - 23 - 2015年11月23 - 2015年
2 Nov-23-2015 Dec-31-9999



我应该如何编写一个select查询,以便根据第一个表格使用第一个表格获得结果。

我应该执行哪些步骤以及更新查询将如何更正位置表中的数据。


我认为你想要lead()

select l.*,
       (case when enddt = '9999-12-31'
             then lead(startdt) over (partition by locid order by startdt)
             else enddt
        end) as new_enddt
from location l;

您可以使用CTE将其并入更新中:

with toupdate as (
      select l.*,
             (case when enddt = '9999-12-31'
                   then lead(startdt) over (partition by locid order by startdt)
                   else enddt
              end) as new_enddt
      from location l
     )
update toupdate
    set enddt = new_enddt
    where enddt <> new_enddt;

我会使用LEAD函数(需要SQL2012 +):

DECLARE @TargetTable TABLE (
    ID      INT IDENTITY(1, 1) PRIMARY KEY,
    LocId   INT  NULL,
    StartDt DATE NULL,
    EndDt   DATE NULL
)

INSERT  @TargetTable (LocId, StartDt, EndDt)
SELECT  s.LocId, TRY_PARSE(s.StartDt AS DATE), TRY_PARSE(s.EndDT AS DATE)
FROM (VALUES    
    (1, 'Jan-23-2015', 'Dec-31-9999'),
    (1, 'Feb-15-2015', 'Dec-31-9999'),
    (2, 'Mar-18-2015', 'Apr-28-2015'),
    (2, 'Nov-23-2015', 'Dec-31-9999'),
    (2, 'Jul-23-2015', 'Nov-23-2015'),
    (2, 'Apr-28-2015', 'Dec-31-9999')
) s(LocId, StartDt, EndDT);

WITH CteUpdate
AS (
    SELECT  t.EndDt, ISNULL(LEAD(t.StartDt) OVER(PARTITION BY t.LocId ORDER BY t.StartDt), '9999-12-31') AS NewEndDt
    FROM    @TargetTable t
) 
UPDATE  CteUpdate
SET     EndDt = NewEndDt;

SELECT * FROM @TargetTable ORDER BY LocId, StartDt

结果:

ID          LocId       StartDt    EndDt
----------- ----------- ---------- ----------
1           1           2015-01-23 2015-02-15
2           1           2015-02-15 9999-12-31
3           2           2015-03-18 2015-04-28
6           2           2015-04-28 2015-07-23
5           2           2015-07-23 2015-11-23
4           2           2015-11-23 9999-12-31

你想要的更新语句看起来像这样:

UPDATE
    Tab1
SET
    Tab1.[StartDT] = Tab2.[StartDT],
    Tab1.[EndDT] = Tab2.[EndDT]
FROM
    [Location] Tab1
    JOIN [Location] Tab2
        ON Tab1.[LocId] = Tab2.[Loc2]

然后,您可以对SELECT语句使用相同的联接。

链接地址: http://www.djcxy.com/p/65615.html

上一篇: Fixing Incorrect Data in Table using the same table

下一篇: Ordering the Months By Federal Fiscal Year