MySQL:过滤含action=2的parentid并统计操作的不同天数
问题:统计剔除特定parentid后的操作天数
需求:先剔除所有包含action=2的parentid的全部数据,再统计剩余数据中每个parentid的操作涉及的不同天数。
示例数据
| id | datecre | action | parentid |
|---|---|---|---|
| 1 | 2022-01-01 01:00:00 | 1 | 52 |
| 2 | 2022-01-02 01:00:00 | 1 | 52 |
| 3 | 2022-01-02 02:00:00 | 1 | 52 |
| 4 | 2022-01-03 01:00:00 | 1 | 65 |
| 5 | 2022-01-04 01:00:00 | 1 | 65 |
| 6 | 2022-01-05 01:00:00 | 1 | 65 |
| 7 | 2022-01-06 01:00:00 | 1 | 65 |
| 8 | 2022-01-07 01:00:00 | 1 | 72 |
| 9 | 2022-01-07 02:00:00 | 2 | 72 |
错误尝试及结果
原查询语句:
WITH overpass(parentid, date) AS ( SELECT parentid, DATE(datecre) as date FROM good WHERE parentid NOT IN ( SELECT DISTINCT parentid FROM good WHERE action=2) GROUP BY date ) SELECT parentid, COUNT(date) as days FROM overpass GROUP BY date;
错误输出:
| parentid | days |
|---|---|
| 52 | 1 |
| 52 | 1 |
| 65 | 1 |
| 65 | 1 |
| 65 | 1 |
| 65 | 1 |
期望输出
| parentid | days |
|---|---|
| 52 | 2 |
| 65 | 4 |
修正后的查询语句
WITH valid_data AS ( SELECT parentid, DATE(datecre) AS date FROM good -- 过滤掉存在action=2的parentid WHERE parentid NOT IN ( SELECT DISTINCT parentid FROM good WHERE action = 2 ) ) SELECT parentid, COUNT(DISTINCT date) AS days FROM valid_data GROUP BY parentid;
错误原因说明
- 原CTE中的
GROUP BY date逻辑错误,会导致每个日期仅保留一条数据,且随机关联一个parentid,破坏了原始数据的对应关系。 - 外层查询
GROUP BY date不符合需求,我们需要按parentid分组来统计每个分组的天数。 - 统计不同天数必须使用
COUNT(DISTINCT date),否则会把同一天的多条记录重复计数。
内容的提问来源于stack exchange,提问作者James Risner
相关产品推荐
相关产品推荐

