首页 > 解决方案 > SQL - 将行合并为一个?

问题描述

我正在尝试从旧的、结构不良的电话系统构建报告。我的表结构如下

 User         Interval                          Logon                            Logoff
 3356        2020-03-27 08:45:00.000            2020-03-27 08:51:45.0620000      NULL
 3356        2020-03-27 09:00:00.000            NULL                             NULL
 3356        2020-03-27 09:15:00.000            NULL                             NULL
 3356        2020-03-27 09:30:00.000            NULL                             2020-03-27 09:32:23.000   
 3356        2020-03-27 09:45:00.000            NULL                             NULL
 3356        2020-03-27 10:00:00.000            2020-03-27 10:11:25.0620000      NULL
 3356        2020-03-27 10:15:00.000            NULL                             2020-03-27 10:11:18.0620000 

数据按 15 分钟的块分组,并显示在这 15 分钟内发生的任何登录或注销。我想要做的是产生一个输出,将任何登录与他们的下一次注销放在同一行。我的输出如下所示。

 User         Interval                          Logon                            Logoff
 3356        2020-03-27                        2020-03-27 08:51:45.0620000       2020-03-27 09:32:23.000   
 3356        2020-03-27                        2020-03-27 10:11:25.0620000       2020-03-27 10:11:18.0620000 

我在这里尝试了解决方案(My Sql merging rows),但这只是给了我一整天的第一次登录和最后一次注销 - 中间缺少一些东西。

标签: sqlsql-server-2012

解决方案


您可以使用lead()和过滤。假设这些值被正确交错:

select user, convert(date, interval), logon
       coalesce(logoff, next_logoff) as logoff
from (select t.*, 
             lead(logoff) over (partition by user order by interval) as next_logoff
      from t
      where logon is not null or logoff is not null
     ) t
where logon is not null;

这也应该处理logofflogon处于相同间隔的情况。


推荐阅读