編輯:在下面的帖子中做了一些澄清
我正在嘗試解決一個問題,我的表缺少時間戳。假設有一個這樣的表:
| 時間戳 | 數字欄位 |
|---|---|
| 2021-10-24 16:59:00.000 | 101 |
| 2021-10-24 16:57:00.000 | 101 |
我想嘗試做兩件事:
填充時間戳為 2021-10-24 16:58:00.000 的第三條記錄。
除此之外,如果領先和滯后記錄匹配,我想將 NumericField 欄位填充為 101,就像在這個例子中一樣。結果將是:
| 時間戳 | 數字欄位 |
|---|---|
| 2021-10-24 16:59:00.000 | 101 |
| 2021-10-24 16:58:00.000 | 101 |
| 2021-10-24 16:57:00.000 | 101 |
如果領先和滯后的 NumericField 記錄不匹配,則生成的 NumericField 將導致 null。例子是:
| 時間戳 | 數字欄位 |
|---|---|
| 2021-10-24 16:59:00.000 | 101 |
| 2021-10-24 16:58:00.000 | 空值 |
| 2021-10-24 16:57:00.000 | 100 |
我發布這個問題的原因是因為 Presto 不支持遞回 CTE,我找不到任何好的資源來幫助我解決這個問題。
uj5u.com熱心網友回復:
我會嘗試使用lag查找以前的值,然后sequence使用interval '1' minute步驟生成日期陣列,取消嵌套并將結果與??原始表合并:
WITH dataset (Timestamp, NumericField) AS (
VALUES (timestamp '2021-10-24 16:59:00.000', 101),
(timestamp '2021-10-24 16:57:00.000', 101),
(timestamp '2021-10-24 16:55:00.000', 99)
)
SELECT date as Timestamp,
val as NumericField
FROM (
SELECT array_except(
sequence(prev_ts, Timestamp, interval '1' minute),
array [ prev_ts, timestamp ] -- exclude border values
) as dates,
case
NumericField
when prev_num then prev_num
end as val
FROM (
SELECT *,
lag(Timestamp) over(order by Timestamp) prev_ts,
lag(NumericField) over(order by Timestamp) prev_num
FROM dataset
)
) seq
CROSS JOIN UNNEST(dates) AS t (date)
UNION
SELECT *
FROM dataset
ORDER BY timestamp
輸出:
| 時間戳 | 數字欄位 |
|---|---|
| 2021-10-24 16:55:00.000 | 99 |
| 2021-10-24 16:56:00.000 | |
| 2021-10-24 16:57:00.000 | 101 |
| 2021-10-24 16:58:00.000 | 101 |
| 2021-10-24 16:59:00.000 | 101 |
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/338948.html
