mysql - 按用户分组选择 5 个连续日期的记录
问题描述
我有下面的表结构,我只想要那些在 5 个连续日期中并按 uid 分组的记录。
这是我的数据结构
用户主
uid | name
1 | A
2 | B
3 | C
4 | D
tbl_referral
refId | uid | Date
1 | 1 | 01-09-2018
2 | 1 | 02-09-2018
3 | 1 | 03-09-2018
4 | 2 | 01-09-2018
5 | 2 | 02-09-2018
6 | 1 | 04-09-2018
7 | 2 | 05-09-2018
8 | 2 | 06-09-2018
9 | 1 | 05-09-2018
10 | 2 | 06-09-2018
现在我只想从 tbl_referral 中获取那些日期连续出现 5 次的记录
所需的输出是
uid | Date
| 01-09-2018
| 02-09-2018
1 | 03-09-2018
| 04-09-2018
| 05-09-2018
解决方案
您可以将表与自身连接起来并计算 5 天范围内的行数。如果计数为 5,则范围包含所有连续日期。
SELECT t1.uid, GROUP_CONCAT(t2.Date) AS dates
FROM tbl_referral AS t1
JOIN tbl_referral AS t2 ON t1.uid = t2.uid AND t2.date BETWEEN t1.date AND DATE_ADD(t1.date, INTERVAL 4 DAY)
GROUP BY t1.uid, t1.date
HAVING COUNT(*) = 5
此查询假定date
列的数据类型是DATE
,而不是字符串。如果它是一个字符串,您需要使用STR_TO_DATE()
它来将其转换为尼克的答案中的日期。但是最好将日期存储为DATE
而不是字符串,这样您就可以使用索引(它们也占用更少的空间)。
推荐阅读
- python - 解析我的代码时出现意外的EOF?为什么会这样?
- python - 哪个python图形库用于移动点
- java - 如何创建一个可以存储对象的类?
- c - 动态结构初始化和计数器实现
- python-3.x - 在不使用算术运算的情况下计算两个二进制字符串的总和需要多少次迭代?
- networking - 是否有必要使用队列来保存从客户端接收并等待转发到后端服务器的消息?
- intellij-idea - 如何让 Intellij IDEA 检查所有默认值的注释?
- haskell - Haskell:使用翻转导致错误:'.>' 的方程有不同数量的参数
- c++ - 如何获取当前调用的文件系统的名称?
- python-3.x - Python计算LennardJones 2D交互对相关分布函数在Grand Canonical Ensemble