【问题标题】:Recursive CTE in MySQL for missing datesMySQL中的递归CTE丢失日期
【发布时间】:2021-06-04 05:02:46
【问题描述】:

我有两张表 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','Sal','11','1'),
('2021-05-28','Rick','10','1'),
('2021-06-01','Rick','12','1'),
('2021-06-02','Liz','11','1'),
('2021-05-28','Liz','10','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。我希望平均表看起来像这样:

workdate 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 Rick 10 1
2021-05-29 Rick 0 0
2021-05-30 Rick 0 0
2021-05-31 Rick 0 0
2021-06-01 Rick 12 1
2021-06-02 Rick 0 0
2021-06-03 Rick 0 0
2021-06-04 Rick 0 0

....等等。

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

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

提前谢谢你!

【问题讨论】:

  • 您现在具备提出更好问题所需的所有能力。请考虑这样做。
  • @Strawberry - 嘿,没问题,如果你能提供帮助,请立即查看 :)

标签: mysql recursive-cte


【解决方案1】:
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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-19
    • 2021-09-29
    • 2017-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多