表位置(LocId,StartDt,EndDt)具有不正确的EndDt。第二个表是它的外观。位置表在prod Db中。我正在使用MS SQL Server
表位置
LocId StartDt EndDT
1月1日至23日2015年12月31日至1991年11月
1月1日至15日2015年12月31日至1991年11月
2015年3月2日至2015年4月28日至2015年8月2日
2015年11月2日至23日,2015年12月31日
2015年7月2日至2015年11月23日至2015年11月23日
2015年4月2日至28日2015年12月31日 - 999年中国
这是决赛桌应该如何看待下面的内容
位置
LocId StartDt EndDT
2015年1月1日至23日2015年2月15日 - 15日
1月1日至15日2015年12月31日至1991年11月
2015年3月2日至2015年4月28日至2015年8月2日
2015年4月2日至28日2015年7月23日
2015年7月2日至2015年11月23日至2015年11月23日
2015年11月2日 - 23日 - 2015年12月31日 - 9月9日
我应该如何编写一个选择查询,根据第二个表格使用第一个表格获得结果。
我应该执行哪些步骤以及更正位置表中数据的更新查询。
答案 0 :(得分:1)
我想你想要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;
答案 1 :(得分:1)
我会使用LEAD function(需要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
答案 2 :(得分:0)
您想要的更新语句如下所示:
UPDATE
Tab1
SET
Tab1.[StartDT] = Tab2.[StartDT],
Tab1.[EndDT] = Tab2.[EndDT]
FROM
[Location] Tab1
JOIN [Location] Tab2
ON Tab1.[LocId] = Tab2.[Loc2]
然后,您可以对SELECT语句使用相同的连接。