代码之家  ›  专栏  ›  技术社区  ›  user2974951

SQL聚合和累积求和

  •  0
  • user2974951  · 技术社区  · 6 年前

    我有一张像这样的用户表

    有许多具有唯一ID的用户,表首先按用户排序,然后按日期时间排序。每个实例都是一个训练或测试会话,测试会话有额外的参数,最重要的是得分。

    我希望汇总此表中的行,以便汇总测试会话之前所有培训会话的时间,并且只返回一个实例以及累积的培训时间和测试分数。在新的培训课程之前,每一个额外的测试都只是一个具有新测试分数的重复实例。当重置新用户(用户ID)之前,此累计时间总和将一直持续。

    得到的表应该是这样的

    是否有一个SQL命令可以实现这一点?(自加入)?< BR> 查询不必过度优化,欢迎使用简单的解决方案。

    有许多具有唯一ID的用户,表首先按用户排序,然后按日期时间排序。每个实例都是一个训练或测试会话,测试会话有额外的参数,最重要的是得分。

    我希望汇总此表中的行,以便汇总测试会话之前所有培训会话的时间,并且只返回一个实例以及累积的培训时间和测试分数。在新的培训课程之前,每一个额外的测试都只是一个具有新测试分数的重复实例。当重置新用户(用户ID)之前,此累计时间总和将一直持续。

    得到的表应该是这样的

    enter image description here

    是否有一个SQL命令可以实现这一点?(自加入)?
    查询不必过度优化,欢迎使用简单的解决方案。

    1 回复  |  直到 6 年前
        1
  •  0
  •   Gordon Linoff    6 年前

    使用 test s.然后聚合以获得每个组中所需的摘要:

    select grp, user_id, sum(time), max(case when task = 'test' then time end) as test_time, max(score)
    from (select t.*,
                 sum(case when task = 'test' then 1 else 0 end) over (partition by user_id order by datetime) as grp
          from t
         ) t
    group by grp, user_id;