-4

可能重复:
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
4

1 回答 1

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

SQL Fiddle 上的实时示例。

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

于 2013-01-29T12:02:43.217 回答