Sql 如何比较同一表格的两条记录?
我在下表的其中一个表中有与计划相关的数据Sql 如何比较同一表格的两条记录?,sql,sql-server,tsql,Sql,Sql Server,Tsql,我在下表的其中一个表中有与计划相关的数据 ScheduledID StartTime EndTime ModifiedTimeStamp 1 10 AM 6 PM 01-01-2014 09:00 1 11 AM 6 PM 01-01-2014 09:30 1 11 AM 7 PM 01-01-2014 10:00 1
ScheduledID StartTime EndTime ModifiedTimeStamp
1 10 AM 6 PM 01-01-2014 09:00
1 11 AM 6 PM 01-01-2014 09:30
1 11 AM 7 PM 01-01-2014 10:00
1 10 AM 6 PM 01-01-2014 10:30
1 11 AM 8 PM 01-01-2014 11:00
ScheduledID StartTime EndTime ModifiedTimeStamp Action Type
1 10 AM 6 PM 01-01-2014 09:00 Schedule Created
1 11 AM 6 PM 01-01-2014 09:30 Start Time Modified from 10AM to 11AM
1 11 AM 7 PM 01-01-2014 10:00 End Time Modified from 6PM to 7PM
1 10 AM 6 PM 01-01-2014 10:30 Start Time Modified from 11AM to 10AM, End Time Modified from 7PM to 6PM
1 11 AM 8 PM 01-01-2014 11:00 Current Schedule
计划开始和结束时间按上述方式修改数次
我需要显示上述数据如下
ScheduledID StartTime EndTime ModifiedTimeStamp
1 10 AM 6 PM 01-01-2014 09:00
1 11 AM 6 PM 01-01-2014 09:30
1 11 AM 7 PM 01-01-2014 10:00
1 10 AM 6 PM 01-01-2014 10:30
1 11 AM 8 PM 01-01-2014 11:00
ScheduledID StartTime EndTime ModifiedTimeStamp Action Type
1 10 AM 6 PM 01-01-2014 09:00 Schedule Created
1 11 AM 6 PM 01-01-2014 09:30 Start Time Modified from 10AM to 11AM
1 11 AM 7 PM 01-01-2014 10:00 End Time Modified from 6PM to 7PM
1 10 AM 6 PM 01-01-2014 10:30 Start Time Modified from 11AM to 10AM, End Time Modified from 7PM to 6PM
1 11 AM 8 PM 01-01-2014 11:00 Current Schedule
请指导我如何才能做到这一点
谢谢。如果您使用的是SQL Server 2012或更高版本,则可以使用LAGANDLEADWindow函数访问上一行和下一行,并使用如下查询来呈现所需的结果:
-- 2012+ version
SELECT
ScheduledID, StartTime, EndTime, ModifiedTimeStamp,
CASE
WHEN prevts IS NULL THEN 'Schedule created'
WHEN prevStartTime <> StartTime AND prevEndTime = EndTime AND nextts IS NOT NULL
THEN CONCAT('Start Time Modified FROM ', prevStartTime, ' to ', StartTime)
WHEN prevStartTime <> StartTime AND prevEndTime <> EndTime AND nextts IS NOT NULL
THEN CONCAT('Start Time Modified FROM ', prevStartTime, ' to ', StartTime,
', End Time Modified FROM ', prevEndTime, ' to ', EndTime)
WHEN prevStartTime = StartTime AND prevEndTime <> EndTime AND nextts IS NOT NULL
THEN CONCAT('End Time Modified FROM ', prevEndTime, ' to ', EndTime)
WHEN nextts IS NULL
THEN 'Current Schedule'
END as 'Action Type'
FROM (
SELECT
ScheduledID,
prevStartTime = LAG(StartTime) OVER (PARTITION by ScheduledID ORDER BY ModifiedTimeStamp),
StartTime,
nextStartTime = LEAD(StartTime) OVER (PARTITION by ScheduledID ORDER BY ModifiedTimeStamp),
prevEndTime = LAG(EndTime) OVER (PARTITION by ScheduledID ORDER BY ModifiedTimeStamp),
EndTime,
nextEndTime = LEAD(EndTime) OVER (PARTITION by ScheduledID ORDER BY ModifiedTimeStamp),
prevts = LAG(ModifiedTimeStamp) OVER (PARTITION by ScheduledID ORDER BY ModifiedTimeStamp),
ModifiedTimeStamp,
nextts = LEAD(ModifiedTimeStamp) OVER (PARTITION by ScheduledID ORDER BY ModifiedTimeStamp)
FROM schedules
) a
对于这两个版本。哪个版本的SQL Server?我使用的是SQL Server 2008版本。您好,我们使用的是SQL Server 2008。你能分享2008版SQL的解决方案吗?@PrasadGuduri我现在也更新了2008版,并对2012+版做了一个小改动。
;
WITH cte
AS ( SELECT ROW_NUMBER() OVER ( PARTITION BY ScheduledID ORDER BY modifiedtimestamp ) AS RN ,
ScheduledID ,
StartTime ,
EndTime ,
ModifiedTimeStamp
FROM schedules
),
laglead2008
AS ( SELECT a.ScheduledID ,
b.StartTime AS prevStartTime ,
a.StartTime ,
c.StartTime AS nextStartTime ,
b.EndTime AS prevEndtime ,
a.EndTime ,
c.EndTime AS nextEndTime ,
b.modifiedtimestamp AS prevts ,
a.ModifiedTimeStamp ,
c.modifiedtimestamp AS nextts
FROM cte AS a
LEFT JOIN cte AS b ON ( a.RN - 1 ) = b.RN
AND b.ScheduledID = a.ScheduledID
LEFT JOIN cte AS c ON ( a.RN + 1 ) = c.RN
AND a.ScheduledID = b.ScheduledID
)
SELECT ScheduledID ,
StartTime ,
EndTime ,
ModifiedTimeStamp ,
CASE WHEN prevts IS NULL THEN 'Schedule created'
WHEN prevStartTime <> StartTime
AND prevEndtime = EndTime
AND nextts IS NOT NULL
THEN 'Start Time Modified from ' + prevStartTime + ' to '
+ StartTime
WHEN prevStartTime <> StartTime
AND prevEndtime <> EndTime
AND nextts IS NOT NULL
THEN 'Start Time Modified from ' + prevStartTime + ' to '
+ StartTime + ', End Time Modified from ' + prevEndtime
+ ' to ' + EndTime
WHEN prevStartTime = StartTime
AND prevEndtime <> EndTime
AND nextts IS NOT NULL
THEN 'End Time Modified from ' + prevEndtime + ' to '
+ EndTime
WHEN nextts IS NULL THEN 'Current Schedule'
END AS 'Action Type'
FROM laglead2008