SQL聚合和累计求和
SQL Aggregation and cumulative summation
我有一个用户 table 看起来像这样
有很多用户具有唯一id,table先按用户排序,再按日期时间排序。每个实例都是训练或测试会话,测试会话有额外的参数,最重要的是分数。
我想聚合此 table 的行,以便将测试会话之前的所有训练会话的时间相加,并且只返回一个实例以及累积训练时间和测试分数.新训练课程之前的每一次额外测试都只是具有新测试分数的重复实例。这个累积时间总和一直持续到新用户(用户 id)被重置时。
结果 table 看起来像这样
是否有 SQL 命令可以实现此目的? (自行加入)?
查询不必过度优化,欢迎简单的解决方案。
使用 test
的累积总和分配一个组。然后聚合以在每个组中获得您想要的摘要:
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;
我有一个用户 table 看起来像这样
有很多用户具有唯一id,table先按用户排序,再按日期时间排序。每个实例都是训练或测试会话,测试会话有额外的参数,最重要的是分数。
我想聚合此 table 的行,以便将测试会话之前的所有训练会话的时间相加,并且只返回一个实例以及累积训练时间和测试分数.新训练课程之前的每一次额外测试都只是具有新测试分数的重复实例。这个累积时间总和一直持续到新用户(用户 id)被重置时。
结果 table 看起来像这样
是否有 SQL 命令可以实现此目的? (自行加入)?
查询不必过度优化,欢迎简单的解决方案。
使用 test
的累积总和分配一个组。然后聚合以在每个组中获得您想要的摘要:
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;