sql - 基于状态变化的分组

标签 sql sql-server

当前表:

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

任何人都可以建议吗?

最佳答案

根据您的意见,您应该使用窗口函数 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]

关于sql - 基于状态变化的分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52398183/

相关文章:

将 varchar 值 'AJH 123' 转换为数据类型 int 时 SQL 转换失败

mysql - 向表中添加或删除列会强制重新创建所有索引吗?

sql - 反转 postgres 中的列

sql-server - 当没有事件连接时,SqlConnection.OpenAsync() 挂起

sql - 用案例反透视表不同的数据类型

sql - MSSQL : How do you script Stored Procedure creation with code?

sql - 计算连续 7 天内重复调用者的数量

r - 无法找到函数 ‘dbWriteTable’ 的继承方法,用于签名 ‘"RODBC", "character", "data.frame"'

mysql - 如何在 MySQL 中合并结果

sql - ETL 使用 SQL for Postgres