要填充的预定义日期范围

问题描述

我想按日期计算项目的数量,但有时表格不包含带有某些日期的行,并且结果中有一个漏洞,例如:

+------------+--------+
| 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

db<>fiddle

,

与您的桌子一起加入您的 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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...