【问题标题】:Query to concatenate rows based on data from multiple rows查询以基于多行数据连接行
【发布时间】:2018-10-31 18:29:05
【问题描述】:

我正在尝试使用 SQL Server 2014 中的查询打印出 xml 结果。

该查询应该返回某个日期范围内的数据,并返回玩家姓名和玩家时间的串联列表。

仅当playEnd 位于下一个玩家playStart 的 30 分钟内时,才会发生串联。

如果我有这样的数据:

Name        PlayDate         PlayStart      PlayEnd
----------------------------------------------------
player1 |   10/8/2018    |   08:00:00   |   09:00:00
player2 |   10/8/2018    |   09:10:00   |   10:10:00
player3 |   10/9/2018    |   10:40:00   |   11:30:00
player4 |   10/11/2018   |   08:30:00   |   08:37:00
player5 |   10/11/2018   |   08:40:00   |   08:50:00  
player6 |   10/12/2018   |   09:00:00   |   09:45:00
player7 |   10/12/2018   |   09:50:00   |   10:10:00
player8 |   10/12/2018   |   10:30:00   |   12:20:00
  • player1 和 player2 播放时间将连接在一起,例如: player1, player2 = 2018 年 10 月 8 日的 8:00:00 - 10:10:00
  • player3 将是:player3 = 10:40:00 - 11:30:00 for 10/9/2018
  • player4 和 player5 的播放时间将连接起来,如:player4, player5 = 08:30:00 - 08:50:00(2018 年 10 月 11 日)
  • player6 和 player7 和 player8 的播放时间将连接起来,如:player6、player7、player8 = 09:00:00 - 12:20:00(2018 年 10 月 12 日)

我已尝试以多种方式修改下面的查询,但我只是不知道如何将一行数据与下一行数据进行比较,然后在需要时将两者(或更多)结合起来。

select Name, PlayDate, PlayStart, PlayEnd
where playDate between '10/8/2018' and '10/12/2018'
for xml auto

有没有办法用 SQL Server 2014 做到这一点?

谢谢!

【问题讨论】:

    标签: sql sql-server sql-server-2014


    【解决方案1】:

    假设半夜左右没有玩游戏,您可以使用 lag() 和累积总和来做到这一点:

    select t.*,
           sum(case when prev_playEnd is null or prev_playEnd < dateadd(-30, minute, playEnd)
                    then 1 else 0
               end) over (partition by playdate order by playStart
                         ) as grouping
    from (select t.*,
                 lag(playEnd) over (partition by playdate order by playStart) as prev_playEnd
          from t
         ) t;
    

    列分组有你想要的信息。

    【讨论】:

    • 谢谢,查询有效,但它只列出了球员和分组号码。我会按分组进行分组以获得串联吗?谢谢!
    • @SkyeBoniwell 。 . .这提供了您要求的信息。您可以汇总以获取有关每个分组的信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多