sql—在mysql中汇总并将表拆分为不同的表

blmhpbnm  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(307)

我有一张这样的table:

user_id  location  duration(s)
-------  --------  -----------
1        room1     75
2        room1     289
1        room2     630
1        room1     287

上表显示了用户在一个房间里呆了多长时间,行数表示用户在一个特定房间里呆了多少次。例如,在上面的数据中,有两行用户1在位置room1中,这意味着他已经在room1中两次了。如何将这些数据转换成下表:

user_id  room_1_freq  room_1_duration  room_2_freq  room_2_duration
-------  -----------  ---------------  -----------  ---------------
1        2            181              1            630
2        1            289              0            0

其中room\ u 1\ u freq和room\ u 2\ u freq是用户在各个房间的次数,room\ u 1\ u duration和room\ u 2\ u duration是用户在每个房间花费的平均时间。这可以在单个查询中完成吗?

m2xkgtsf

m2xkgtsf1#

回答你的问题有一种更简单(而且可能更灵活)的方法。您的第二个(结果)表将随着每个房间和每个需要报告的用户的列数呈指数级扩展,在我看来,这将变得难以管理。另外,使用gordon的解决方案,每次添加用户或文件室时,都必须重写查询。
如果在sql中使用标准的sum、count和average函数以及标准的grouping子句对数据进行汇总,那么维护起来就容易多了:

SELECT user_id, location, count(location), sum(duration), avg(duration) 
FROM visits
group by user_id, location

这将为您提供所需的结果,但格式略有不同:

通过这种方式,您可以添加任意多个房间和用户,并且摘要信息将始终有效。添加日期或时间列来过滤结果也很容易。

zujrkrfu

zujrkrfu2#

如果我理解正确,这只是条件聚合:

select user_id,
       sum(location = 'room1') as room1_freq,
       sum(case when location = 'room1' then duration else 0 end) as room1_dur,
       sum(location = 'room2') as room2_freq,
       sum(case when location = 'room2' then duration else 0 end) as room1_dur
from t
group by user_id;

相关问题