【问题标题】:Grouping based on state change基于状态变化的分组
【发布时间】:2018-09-19 04:41:29
【问题描述】:

当前表:

Name    State   Start  Time
A       Start   17/01 2pm
A       update  17/01 4pm
B       Start   18/01 3pm
B       Start   18/01 5pm
C       Start   18/01 6pm
B       Start   19/01 2pm

我正在寻找的输出:

Name    StartTime   End Time
A      17/01 2pm    17/01 4pm
B      17/01 4pm    18/01 5pm
C      18/01 5pm    18/01 6pm
B      18/01 6pm    19/01 2pm

谁能给点建议?

【问题讨论】:

  • 有标识栏吗?
  • 如果有帮助,我可以创建这个
  • 为什么 B 从下午 4 点开始?应该是下午 3 点?或应考虑任何特殊情况..您需要编写所有此类情况
  • 告诉我们这是用于哪个数据库。 “SQL”不足以告诉我们您的数据库需要什么特定语法。
  • SQL 服务器 2014

标签: sql sql-server


【解决方案1】:

根据您的 cmets,您应该使用窗口函数 LAG 或 LEAD。看看下面的示例代码:

LAG:访问同一结果集中前一行的数据。

LEAD:访问同一结果集中后续行的数据。

with
    cte
as
(
    select
        [Name]  ,
        [State] ,
        lag(StartTime) over(order by [Name], [State], StartTime)    as StartTime    ,
        StartTime   as EndTime
    from
        dbo.Test
)
select
    [Name]                          ,
    [State]                         ,
    min(StartTime)  as StartTime    ,
    max(EndTime)    as EndTime
from
    cte
group by
    [Name]  ,
    [State]

【讨论】:

  • 感谢 Mohammad 展示了 Lag 功能真的很方便
猜你喜欢
  • 2011-03-07
  • 2021-10-22
  • 2017-03-19
  • 1970-01-01
  • 1970-01-01
  • 2018-12-21
  • 2017-11-13
  • 2020-08-20
  • 1970-01-01
相关资源
最近更新 更多