使用同一个表修复表中的数据不正确
表位置(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