为日期范围内的每一天创建一行?

Mar*_* AJ 1 mysql sql mariadb

我有一个这样的表:

+----+---------+------------+
| id |  price  |    date    |
+----+---------+------------+
| 1  | 340     | 2018-09-02 |
| 2  | 325     | 2018-09-05 |
| 3  | 358     | 2018-09-08 |
+----+---------+------------+
Run Code Online (Sandbox Code Playgroud)

我需要创建一个每天都有一行的视图。像这样的东西:

+----+---------+------------+
| id |  price  |    date    |
+----+---------+------------+
| 1  | 340     | 2018-09-02 |
| 1  | 340     | 2018-09-03 |
| 1  | 340     | 2018-09-04 |
| 2  | 325     | 2018-09-05 |
| 2  | 325     | 2018-09-06 |
| 2  | 325     | 2018-09-07 |
| 3  | 358     | 2018-09-08 |
+----+---------+------------+
Run Code Online (Sandbox Code Playgroud)

我可以使用带有循环 ( foreach) 的 PHP 并创建一个临时变量来保存先前的价格,直到出现新的日期。

但我需要创建一个视图......所以我应该使用纯 SQL 来做到这一点......知道我该怎么做吗?

tri*_*cot 5

您可以使用递归 CTE 来生成“间隙”中的记录。为了避免“填充”最后一个日期后出现无限间隙,请首先获取源数据中的最大日期,并确保在递归中不要绕过该日期。

我已经给你的桌子打电话了tbl

with recursive cte as (
    select     id, 
               price, 
               date, 
               (select max(date) date from tbl) mx
    from       tbl
    union all
    select     cte.id,
               cte.price, 
               date_add(cte.date, interval 1 day),
               cte.mx
    from       cte
    left join  tbl
           on  tbl.date = date_add(cte.date, interval 1 day)
    where      tbl.id is null
           and cte.date <> cte.mx
)
select   id, 
         price, 
         date
from     cte
order by 3;
Run Code Online (Sandbox Code Playgroud)

使用 mysql 8 进行演示

  • [“通用表表达式”](https://mariadb.com/kb/en/library/with/)——这确实是“with”关键字后面的内容。注意:我不确定您的 MariaDB 版本是否支持“with recursive”语法。我希望它能... (2认同)
  • 它只是要排序的列号(“日期”)。与行无关。 (2认同)