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