【问题标题】:SQL SELECTING ROW [duplicate]SQL选择行[重复]
【发布时间】:2013-01-12 23:37:22
【问题描述】:

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

【问题讨论】:

  • 名称为id 且值为start/stop 的列? time是什么类型的?
  • 没有the accepted answer 帮助你吗?
  • @Tim Schmelter ,时间是 TIME/DATE 类型,看起来像 this,但输出像上面的那些
  • 我投票重新开放的理由与我提出的 when suggesting to post this new question 相同。在 OP 决定他们想要不同格式的输出之前,前一个已经收集了几个答案。编辑上一个问题基本上会消除当时发布的答案。

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


【解决方案1】:

我想要的输出只需要第一次启动和之后的每次启动 停止和最近的停止

这很容易通过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.

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

【讨论】:

  • 对不起,我的错误,请再看我的帖子
猜你喜欢
  • 2020-10-16
  • 2011-12-06
  • 1970-01-01
  • 2020-07-27
  • 2010-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多