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)