按用户分组选择5个连续日期的记录

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

关闭。这个问题需要更加突出重点。它目前不接受答案。
**想改进这个问题吗?**通过编辑这篇文章更新这个问题,使它只关注一个问题。

两年前关门了。
改进这个问题
我有下面的表结构,其中我只想那些记录,这是在5个连续的日期和组的uid。
这是我的数据结构
用户\u主机

uid | name
1   |  A
2   |  B
3   |  C
4   |  D

tbl\U转介

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èu referror获取那些日期连续出现5次的记录
所需输出为

uid | Date
    | 01-09-2018
    | 02-09-2018
1   | 03-09-2018
    | 04-09-2018
    | 05-09-2018
b1zrtrql

b1zrtrql1#

您可以通过将表与自身连接4次来实现这一点,以后每一天连接一次。请注意,由于您的日期不是mysql格式,您必须将其转换为数学:

SELECT t1.uid, CONCAT_WS(',', t1.Date, t2.Date, t3.Date, t4.Date, t5.Date) AS Dates
FROM tbl_referral t1
JOIN tbl_referral t2 ON t2.uid = t1.uid AND
  STR_TO_DATE(t2.Date, '%d-%m-%Y') = STR_TO_DATE(t1.Date, '%d-%m-%Y') + INTERVAL 1 DAY
JOIN tbl_referral t3 ON t3.uid = t2.uid AND
  STR_TO_DATE(t3.Date, '%d-%m-%Y') = STR_TO_DATE(t2.Date, '%d-%m-%Y') + INTERVAL 1 DAY
JOIN tbl_referral t4 ON t4.uid = t3.uid AND
  STR_TO_DATE(t4.Date, '%d-%m-%Y') = STR_TO_DATE(t3.Date, '%d-%m-%Y') + INTERVAL 1 DAY
JOIN tbl_referral t5 ON t5.uid = t4.uid AND
  STR_TO_DATE(t5.Date, '%d-%m-%Y') = STR_TO_DATE(t4.Date, '%d-%m-%Y') + INTERVAL 1 DAY

输出:

uid     Dates
1       01-09-2018,02-09-2018,03-09-2018,04-09-2018,05-09-2018

sqlfiddle演示

ddarikpa

ddarikpa2#

您可以将表与其自身连接起来,并计算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 而不是字符串,因此可以使用索引(它们占用的空间也较少)。

相关问题