问题描述
我想按日期计算项目的数量,但有时表格不包含带有某些日期的行,并且结果中有一个漏洞,例如:
+------------+--------+
| 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 |
...
解决方法
UNION ALL 版本
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 date,count(*) - 1 AS number
from (
select date
from Date_Ranges
union all
select DATE(time)
from my_table
where time >= NOW() - INTERVAL 3 MONTH
AND time <= DATE(NOW())
) t
group by date
,
与您的桌子一起加入您的 cte :
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 dr.date,coalesce(sum(t.num),0)
from Date_Ranges dr
left join my_table t
on dr.date = t.datecol
group by dr.date
dbfiddle here