Mysql MariaDB版本支持递归语法的。我希望是这样……你能解释一下orderby子句中的3是什么吗?另一个数据集(超过3行)的情况如何?它只是要排序的列的编号(date)。与行无关。非常感谢。。只有两个问题,CTE代表什么?(谷歌相信慢性创伤性脑病在这种情况下

Mysql MariaDB版本支持递归语法的。我希望是这样……你能解释一下orderby子句中的3是什么吗?另一个数据集(超过3行)的情况如何?它只是要排序的列的编号(date)。与行无关。非常感谢。。只有两个问题,CTE代表什么?(谷歌相信慢性创伤性脑病在这种情况下,mysql,sql,mariadb,Mysql,Sql,Mariadb,MariaDB版本支持递归语法的。我希望是这样……你能解释一下orderby子句中的3是什么吗?另一个数据集(超过3行)的情况如何?它只是要排序的列的编号(date)。与行无关。非常感谢。。只有两个问题,CTE代表什么?(谷歌相信慢性创伤性脑病在这种情况下毫无意义)。而with在MySQL中做了什么这确实是一个带有关键字的之后的内容。注意:我不确定您的MariaDB版本是否支持递归语法的。我希望是这样……你能解释一下orderby子句中的3是什么吗?另一个数据集(超过3行)的情况如何?它只是要排


MariaDB版本支持递归语法的
。我希望是这样……你能解释一下
orderby
子句中的
3
是什么吗?另一个数据集(超过3行)的情况如何?它只是要排序的列的编号(
date
)。与行无关。非常感谢。。只有两个问题,
CTE
代表什么?(谷歌相信慢性创伤性脑病在这种情况下毫无意义)。而
with
在MySQL中做了什么这确实是一个带有关键字的
之后的内容。注意:我不确定您的MariaDB版本是否支持递归语法的
。我希望是这样……你能解释一下
orderby
子句中的
3
是什么吗?另一个数据集(超过3行)的情况如何?它只是要排序的列的编号(
date
)。与行无关。考虑到这是CTE,UNION ALL位似乎有点多余。@Trincot答案可能会被标记,但如果有人想要一个不依赖于分析函数或递归的解决方案,那么我的答案是一个选项。考虑到这是CTE,UNION ALL位似乎有点多余。@Trincot的答案可能会被标记,但是如果有人想要一个不依赖于分析函数或递归的解决方案,那么我的答案是一个选项。
+----+---------+------------+
| id |  price  |    date    |
+----+---------+------------+
| 1  | 340     | 2018-09-02 |
| 2  | 325     | 2018-09-05 |
| 3  | 358     | 2018-09-08 |
+----+---------+------------+
+----+---------+------------+
| 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 |
+----+---------+------------+
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;
WITH cte AS (    
    SELECT cal.date, t.price, t.id
    FROM
    (
        SELECT '2018-09-02' AS date UNION ALL
        SELECT '2018-09-03' UNION ALL
        SELECT '2018-09-04' UNION ALL
        SELECT '2018-09-05' UNION ALL
        SELECT '2018-09-06' UNION ALL
        SELECT '2018-09-07' UNION ALL
        SELECT '2018-09-08'
    ) cal
    LEFT JOIN yourTable t
        ON cal.date = t.date
),
cte2 AS (
    SELECT
        t1.date,
        t1.price,
        t1.id,
        (SELECT MAX(t2.date) FROM cte t2
         WHERE t2.date <= t1.date AND t2.price IS NOT NULL) AS nearest_date
    FROM cte t1
)

SELECT
    (SELECT t2.id FROM yourTable t2 WHERE t2.date = t1.nearest_date) id,
    (SELECT t2.price FROM yourTable t2 WHERE t2.date = t1.nearest_date) price,
    t1.date
FROM cte2 t1
ORDER BY
    t1.date;
MariaDB [test]> SELECT  '2019-01-01' + INTERVAL seq-1 DAY  FROM seq_1_to_31;
+-----------------------------------+
| '2019-01-01' + INTERVAL seq-1 DAY |
+-----------------------------------+
| 2019-01-01                        |
| 2019-01-02                        |
| 2019-01-03                        |
| 2019-01-04                        |
| 2019-01-05                        |
| 2019-01-06                        |
(etc)