开发者社区> 问答> 正文

如何只对零差的记录求和

我在sql server查询中有问题,这里是

Table 1
Id  |User   |Start  |End
====+=======+=======+======
1   | 5     | 1:00  | 2:00
2   | 5     | 2:00  | 3:00
3   | 5     | 3:00  | 4:00
4   | 5     | 7:20  | 8:35
5   | 7     | 3:00  | 4:30

Result 
ID  |User   |Start  |End    |TotalAll   |Running
====+=======+=======+=======+===========+========
1   |5      |1:00   | 2:00  | 3.0       | 1.0
2   |5      |2:00   | 3:00  | 3.0       | 2.0
3   |5      |3:00   | 4:00  | 3.0       | 3.0
4   |5      |7:20   | 8:35  | 1.25      | 1.25
5   |7      |3:00   | 4:30  | 1.5       | 1.5

由于会话1&2&3相互之间无间断连接,并且它们也是来自同一用户,因此我想再增加2列1,即该连接会话的总小时数为3.0小时2 ,即总运行时间,第一条记录为1小时,第二条记录为2小时,第三条记录为3小时。

展开
收起
祖安文状元 2020-01-03 16:21:26 476 0
1 条回答
写回答
取消 提交回答
  • 主要问题是确定哪个是"connected" Id。为此,递归cte rcte查询用于根据Start和End时间进行识别

    至于TotalAll和Running,这只是sum()与窗口功能一起使用

    ; with 
    cte as
    (
        select  *, 
                rn  = row_number() over (partition by [User] order by [Start])
        from    your_table t
    ),
    rcte as
    (
        select  *, grp = 1
        from    cte 
        where   rn  = 1
    
        union all
    
        select  c.*, 
                grp = case when r.[End] = c.[Start] then r.grp else r.grp + 1 end
        from    rcte r
                inner join cte c    on  r.[User]    = c.[User]
                                   and  r.rn        = c.rn - 1
    )
    select  r.[Id], r.[User], r.[Start], r.[End],
            TotalAll = sum(datediff(minute, [Start], [End])) 
                       over (partition by [User], [grp]) / 60.0,
            Running  = sum(datediff(minute, [Start], [End])) 
                       over (partition by [User], [grp] 
                                 order by Id) / 60.0
    from    rcte r
    order by [Id]
    
    2020-01-03 16:21:38
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载