我有下表
+--------+----+----+----+----+----+----+
| userid | z0 | z1 | z2 | z3 | z4 | z5 |
+--------+----+----+----+----+----+----+
| 4711 | 0 | 1 | 1 | 0 | 0 | 0 |
| 4712 | 1 | 1 | 8 | 0 | 5 | 0 |
| 4713 | 3 | 5 | 1 | 0 | 0 | 0 |
| 4714 | 0 | 4 | 2 | 0 | 11 | 0 |
+--------+----+----+----+----+----+----+
此表记录特定时间段内发生的事件数。也就是说,在给定的时间范围内(0-4、4-8、8-12、12-16、16-20、20-24点钟),从某个用户id到某个网站的页面浏览量。
我想使用sql计算以下内容:
有多少时间段(每个用户)至少有一次访问?
有多少时间段(每个用户)至少有k次访问(k=5,10)?
预期结果:
+--------+--------+--------+---------+
| userid | visit1 | visit5 | visit10 |
+--------+--------+--------+---------+
| 4711 | 2 | 0 | 0 |
| 4712 | 4 | 2 | 0 |
| 4713 | 3 | 1 | 0 |
| 4714 | 3 | 1 | 1 |
+--------+--------+--------+---------+
到目前为止我所拥有的:
对于“有多少时间段(每个用户)至少有一次访问?”的问题,我尝试过类似的方法,但没有成功:
SELECT
SUM(
CASE WHEN z0>0 THEN 1 ELSE 0 END
CASE WHEN z1>0 THEN 1 ELSE 0 END
CASE WHEN z2>0 THEN 1 ELSE 0 END
CASE WHEN z3>0 THEN 1 ELSE 0 END
CASE WHEN z4>0 THEN 1 ELSE 0 END
CASE WHEN z5>0 THEN 1 ELSE 0 END
) AS visit1
FROM timetable ;
3条答案
按热度按时间6tqwzwtp1#
正如草莓提到的,最好修改你的模式设计。但是,如果您只想获得所需的结果,可以尝试以下方法(不是最佳解决方案):
演示
lyfkaqu12#
基于你现有的结构,如果你能调整到一个更好的格式将使事情变得更容易。。。但不能抵挡,试试看
s4n0splo3#
修复架构后,有效查询可能如下所示: