SQL SELECTING ROW

时间:2013-01-29 11:51:31

标签: sql sql-server sql-server-2005

  

可能重复:
  SQL SERVER SELECTING ROW

如果我有下表

   id         time
   start      08.00 AM 
   stop       09.00 AM
   stop       09.30 AM
   start      09.30 AM
   start      11.00 AM
   start      11.30 AM
   stop       11.30 AM
   stop       12.00 PM

我想要输出看起来像下面的输出:

任何解决方案?

这就是我想要的输出:

    id         time       end_time    interval 
   start      08.00 AM    09.00 AM      60 minute
   stop       09.00 AM    09.30 AM      30 minute
   start      09.30 AM    11.30 AM      120 minute
   stop       11.30 AM    12.00 PM      30 minute
   stop       12.00 PM     NULL          NULL

1 个答案:

答案 0 :(得分:0)

  

我希望输出只占用每个第一次启动和每次启动   停止和最后一站

使用row_number()窗口函数轻松完成:

; with  numbered as
        (
        select  row_number() over (order by [time]) rn
        ,       count(*) over() as cnt
        ,       *
        from    Table1
        )
select  *
from    numbered cur
left join
        numbered prev
on      cur.rn = prev.rn + 1
left join
        numbered next
on      cur.rn = next.rn - 1
where   cur.rn in (1, cur.cnt) -- first or last row
        or (cur.id = 'start' and prev.id = 'stop') -- start after stop
order by
        cur.rn

Live example on SQL Fiddle.

并非您的示例输出不符合您的要求。它包括几个不符合三个条件的行(第一行,最后一行,停止后开始。)