[英]How to select only those records which are present in given all DATE range
我想 select 只有所有日期都存在重复数据计数的数据。
示例我的表数据是:
用户身份 | row_created |
---|---|
8SRWS3hMR | 2020-12-14 00:13:31 |
8SRWS3hMR | 2020-12-14 00:35:06 |
8SRWS3hMR | 2020-12-14 12:11:37 |
8SRWS3hMR | 2020-12-14 13:16:27 |
8SRWS3hMR | 2020-12-14 16:30:00 |
8SRWS3hMR | 2020-12-14 19:25:11 |
8SRWS3hMR | 2020-12-14 19:27:07 |
8SRWS3hMR | 2020-12-15 17:14:06 |
8SRWS3hMR | 2020-12-16 14:53:54 |
如果我 select 的日期范围在2020-12-14
到2020-12-17
之间,那么 output 应该是 Z37A6259CC0C1DAE299A7866489DFF0BD。
如果我 select 日期范围在2020-12-14
到2020-12-16
之间,那么 output 应该低于
用户身份 | 全部的 | row_created |
---|---|---|
8SRWS3hMR | 7 | 2020-12-14 00:13:31 |
8SRWS3hMR | 1 | 2020-12-15 17:14:06 |
8SRWS3hMR | 1 | 2020-12-16 14:53:54 |
我试过下面的查询
select user_id, count(user_id) as total, row_created from reward
where user_id = '8SRWS3hMR' AND DATE(row_created) BETWEEN '2020-12-14' AND '2020-12-17'
group by DATE(row_created);
但根据我的要求, output 应该是 null 因为在BETWEEN
日期范围内我已经通过'2020-12-17'
。
请忽略语法错误。
您可以按如下方式使用HAVING
子句:
SELECT USER_ID,
COUNT(USER_ID) AS TOTAL,
ROW_CREATED
FROM REWARD
WHERE USER_ID = '8SRWS3hMR'
AND DATE(ROW_CREATED) BETWEEN '2020-12-14' AND '2020-12-17'
GROUP BY DATE(ROW_CREATED)
HAVING COUNT(DISTINCT DATE(ROW_CREATED)) = datediff('2020-12-17', '2020-12-14') + 1;
- 更新
SELECT * FROM
(SELECT USER_ID,
COUNT(USER_ID) AS TOTAL,
ROW_CREATED,
COUNT(DISTINCT DATE(ROW_CREATED)) OVER (PARTITION BY USER_ID) AS CNT
FROM REWARD
WHERE USER_ID = '8SRWS3hMR'
AND DATE(ROW_CREATED) BETWEEN '2020-12-14' AND '2020-12-17'
GROUP BY USER_ID, DATE(ROW_CREATED)
) T WHERE CNT = datediff('2020-12-17', '2020-12-14') + 1
这有点复杂,因为您需要按日期汇总。 您可以使用 window 函数:
SELECT r.*
FROM (SELECT USER_ID, DATE(ROW_CREATED) as date, COUNT(*) AS TOTAL,
MIN(ROW_CREATED) as ROW_CREATED,
COUNT(*) OVER (PARTITION BY USER_ID) as num_days,
DATEDIFF(x.end_date, x.start_date) + 1 AS total_days
FROM REWARD R CROSS JOIN
(SELECT DATE('2020-12-14') as START_DATE, DATE('2020-12-17') as END_DATE
) params
WHERE USER_ID = '8SRWS3hMR' AND
ROW_CREATED >= x.start_date AND
ROW_CREATE <= x.end_date + interval 1 day
GROUP BY DATE(ROW_CREATED)
) R
WHERE num_days = total_days;
子查询按天汇总。 它包括两个方面:
USER_ID
的不同天数。 为了避免多次输入相同的日期,这些日期在子查询中定义。 另请注意,日期比较已重新安排。 不使用DATE()
function,而是使用不等式。 这使得表达式与索引更兼容。
select user_id, count(user_id) as total, row_created from reward where user_id = '8SRWS3hMR' AND DATE(row_created) >= '2020-12-14' AND DATE(row_created) <= '2020-12-17' group by DATE (row_created) 有 count(user_id) >= DATEDIFF(row_created, '2020-12-17')
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.