MySQL中缺少日期的递归CTE

问题描述

我有两个表 DT 和平均值:

CREATE TABLE averages (
  `workdate` DATE NULL,`emp` VARCHAR(45) NOT NULL,`Score1` INT NULL,`Score2` INT NULL);

INSERT INTO averages VALUES
('2021-06-01','Sal','12','1'),('2021-06-02','11',('2021-05-28','Rick','10',('2021-06-01','Liz','1');

CREATE TABLE datestemp AS
SELECT Min(workdate) AS date,emp
FROM averages
GROUP BY emp;

CREATE TABLE DT AS
with recursive cte as (
      select emp,date
      from datestemp
      union all
      select emp,date + interval 1 day
      from cte
      where date <= curdate()
     )
select *
from cte
order by emp,date;

我希望平均值表具有与 DT 表中类似的日期,即我希望averages.workdate 列具有从最小日期到今天日期的员工(emp)的所有日期。然后,在递归 CTE 函数添加额外日期的任何地方,Score1 和 Score2 列都可以为 0。我希望平均表看起来像这样:

工作日期 emp score1 score2
2021-06-01 Sal 12 1
2021-06-02 Sal 11 1
2021-06-03 Sal 0 0
2021-06-04 Sal 0 0
2021-05-28 瑞克 10 1
2021-05-29 瑞克 0 0
2021-05-30 瑞克 0 0
2021-05-31 瑞克 0 0
2021-06-01 瑞克 12 1
2021-06-02 瑞克 0 0
2021-06-03 瑞克 0 0
2021-06-04 瑞克 0 0

....等等。

我尝试加入两个表,但无法获得我想要的结果。 可能有一种方法可以跳过创建 DT 表并使用平均表中的最小日期,然后在其上使用递归 CTE?我不确定这是否或如何工作,这是递归 CTE 函数的新手。关于如何解决这个问题的任何想法?

dbfiddle 在这里:https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=0010c4d5e3a1c2eac9c065b31344f128

先谢谢你!

解决方法

WITH RECURSIVE
cte AS ( SELECT MIN(dt) dt
         FROM table
         UNION ALL
         SELECT dt + INTERVAL 1 DAY FROM cte WHERE dt < CURRENT_DATE )
SELECT cte.dt,table.*
FROM cte
JOIN table ON table.dt <= cte.dt;

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...