【发布时间】:2021-05-17 13:34:38
【问题描述】:
我想按日期计算项目的数量,但有时表格不包含带有某些日期的行,结果我有一个洞,比如:
+------------+--------+
| date | number |
+------------+--------+
| 2021-03-12 | 1 |
| 2021-03-15 | 1 |
| 2021-03-17 | 1 |
| 2021-03-18 | 1 |
+------------+--------+
我想要这个结果:
+------------+--------+
| date | number |
+------------+--------+
| 2021-03-12 | 1 |
| 2021-03-13 | 0 |
| 2021-03-14 | 0 |
| 2021-03-15 | 1 |
| 2021-03-16 | 0 |
| 2021-03-17 | 1 |
| 2021-03-18 | 1 |
+------------+--------+
所以,我用WITH 创建了一个临时表,它可以工作:
WITH recursive Date_Ranges AS (
select DATE(NOW() - INTERVAL 3 MONTH) AS Date
union
select Date + interval 1 day
from Date_Ranges
where Date < DATE(NOW())
)
SELECT *, 0 AS number FROM Date_Ranges
接下来,我想检索统计信息,我尝试了以下查询:
WITH recursive Date_Ranges AS (
select DATE(NOW()- INTERVAL 3 MONTH) AS Date
union
select Date + interval 1 day
from Date_Ranges
where Date < DATE(NOW())
)
select *, '0' AS value from Date_Ranges
UNION DISTINCT
SELECT DATE(time) AS date, count(*) AS number
FROM my_table
WHERE time >= NOW()- INTERVAL 3 MONTH
AND time <= DATE(NOW())
GROUP BY DATE(ca_time)
但UNION 不起作用,因为值不同,所以 mysql 保留 2 行:
example:
+------------+--------+
| date | number |
+------------+--------+
| 2021-03-12 | 0 |
| 2021-03-13 | 0 |
| 2021-03-14 | 0 |
| 2021-03-15 | 0 |
| 2021-03-16 | 0 |
| 2021-03-17 | 0 |
| 2021-03-18 | 0 |
| 2021-03-12 | 2 |
| 2021-03-13 | 6 |
| 2021-03-14 | 7 |
| 2021-03-15 | 8 |
| 2021-03-16 | 9 |
| 2021-03-17 | 5 |
| 2021-03-18 | 0 |
+------------+--------+
0 的行如何与第二个并集合并?
谢谢。
编辑:
我尝试了这个查询,但没有结果的日期不在这里:
WITH recursive dates AS (
SELECT DATE(NOW() - INTERVAL 3 MONTH) AS Date
UNION ALL
SELECT Date + interval 1 day
FROM dates
WHERE Date < DATE(NOW())
)
SELECT date, COALESCE(COUNT(1), 0) AS number
FROM dates
LEFT JOIN geo
ON dates.date = DATE(geo.ca_time)
WHERE departmentCode = '89'
GROUP BY geo.ca_time
ORDER BY geo.ca_time
结果:
+------------+--------+
| date | number |
+------------+--------+
| 2021-02-21 | 1 |
| 2021-02-22 | 11 |
| 2021-02-27 | 8 |
...
【问题讨论】:
-
使用
calendar left join datatable和COALESCE(number, 0)。 -
或者考虑处理应用代码中数据显示的问题
-
感谢@Akina,我阅读了dev.mysql.com/doc/refman/8.0/en/with.html 上的“日期系列生成”部分,但在他们的示例中,它是一个 SUM,而不是一个 COUNT。如果我尝试使用 COUNT,我永远不会得到 0,最小值是 1...
-
您的
WHERE条件正在删除其中包含0值的行,因为departmentCode将是NULL。将该条件移动到LEFT JOIN中,而不是LEFT JOIN geo ON dates.date = DATE(geo.ca_time) AND departmentCode = '89'
标签: mysql sql mariadb mariadb-10.5