有这样一个日志表,存着用户点击的记录,一天可能有多条记录;现在想统计出,只有一天点击记录的用户,有两天的点击记录的用户,有三天的点击记录的用户,以此类推4天,5天....这个sql应该如何写?
表相关字段:
id(PK,AI) | user_id | click_time(点击时间:Y-m-d H:i:s) |
有这样一个日志表,存着用户点击的记录,一天可能有多条记录;现在想统计出,只有一天点击记录的用户,有两天的点击记录的用户,有三天的点击记录的用户,以此类推4天,5天....这个sql应该如何写?
表相关字段:
id(PK,AI) | user_id | click_time(点击时间:Y-m-d H:i:s) |
来,逻辑,先将点击时间设置在某个范围然后去重 user_id (distinct),或者分组 group by。这是第一步,然后使用 count 函数进行统计,总共有多少条,也就是有多少天,然后再依据这个结果进行分组。也就出现了,一天,两天,三天的排列。希望具体语句如果不会你要先去学习一下。具体写的我写在下面给你。
select a.datenum,group_concat(a.user_id,',') from (select count(*) as datenum,user_id from table group by to_days(click_time),user_id ) as a group by a.datenum;
ps: 啊,因为没有具体数据测试,具体能不能使用,你还是要测试一下(如果你要用我写的话)。逻辑大概如此。
3 回答1.7k 阅读✓ 已解决
2 回答1.2k 阅读✓ 已解决
2 回答1.4k 阅读✓ 已解决
2 回答1.3k 阅读✓ 已解决
1 回答1k 阅读✓ 已解决
3 回答1.6k 阅读
2 回答971 阅读✓ 已解决
先说结果。
SELECT TO_DAYS(MAX(time))-TO_DAYS(MIN(time)),USER FROM test GROUP BY USER
执行后,结果如下:
0 王
1 李
2 张
根据用户分组查询,然后计算该用户的最大时间和最小时间之差。比如0和王这条记录,表示王这个用户所有记录都在同一天。
---------------------------分割线-----------------------------
经过@邢爱明同学的提示,才发现自己第一时间想错了。
重新思考以后,只需要写一句代码即可。
自己测试新建了一张表test,表结构如下
执行完sql以后如下: