@
sun522198558 对于 `MySQL`,官方不建议这样使用 *(两周前就有人 [发帖](
/t/883301 ) 说赋值异常的)*
- 『在同一条语句内赋值和读取一个用户变量』的行为未定义
- 『在 `SELECT` 中赋值用户变量』已被弃用,未来会移除
@
uil330 你是啥数据库啊?
我看 `MySQL` 的 `LAG()`、`LAST_VALUE()` 等窗口函数,都还不支持 `IGNORE NULLS`
`SQLite` 也还不支持在 `LAG()` 等窗口函数上使用 `FILTER (WHERE xxx IS NOT NULL)`,但能用在聚合函数上
所以用 `SQLite` 写了试试:
*( V 站排版原因,开头有全角空格。若要复制运行,记得删除)*
```sqlite
WITH
data(id, data, time) AS (
VALUES
(1, 10, '00:03'),
(1, 50, '04:23'),
(1, 20, '07:03')
),
ids(id) AS (
SELECT DISTINCT id
FROM data
),
time(hour) AS (
SELECT value
FROM json_each('[1, 2, 3, 4, 5, 6, 7, 8]')
),
formated(id, hour, data) AS (
SELECT id, strftime('%H', time) + 1, data
FROM data
)
-- 按 id 分组,hour 为顺序,窗口范围为 [组内第一行, 当前行],并过滤掉 NULL 值,
-- 剩余值合并成 json 数组,然后取数组最后一位(这个数组至多 24 个数嘛,不算大)
SELECT id,
json_group_array(data) FILTER(WHERE data IS NOT NULL) OVER win ->> '$[#-1]' data,
format('%02d:00', hour) time
FROM ids
JOIN time
LEFT JOIN formated USING(id, hour)
WINDOW win AS (PARTITION BY id ORDER BY hour);
```