我有一些数据:每天的销售额,但有时我有丢失的数据,所以没有记录(例如在周末,但不仅如此)。对于这些日期,我想用最后一个已知值替换空值。我创建了一个引用表,其中包含所有日历日期和一个布尔值,告诉我是否有当天的数据。
例如:
Date | is_data_present | 27/10/2022 | 1 |
---|---|
28/10/2022 | 1 |
29/10/2022 | 0 |
10/10/2022 | 0 |
基本上,您不需要窗口函数。
合并是针对第一行为0的情况,因此在它之前没有值
SELECT
"Date", "is_data_present",
COALESCE((SELECT "Date" FROM table1 WHERE "Date" <= Tab1."Date" AND "is_data_present" = 1 ORDER BY "Date" DESC LIMIT 1 ),"Date") date_to_use
FROM table1 tab1
我尝试过LEAD的东西,但我不知道如何添加一个条件,如'where is_data_present = 1'
除了@nbk的方法,如果你想使用一个窗口函数,你可以考虑FIRST_VALUE
或LAST_VALUE
,因为LEAD
或LAG
不支持IGNORE NULLS
。
WITH sample_table AS (
SELECT '27/10/2022' date, 1 is_data_present UNION ALL
SELECT '28/10/2022' date, 1 is_data_present UNION ALL
SELECT '29/10/2022' date, 0 is_data_present UNION ALL
SELECT '30/10/2022' date, 0 is_data_present
)
SELECT *,
LAST_VALUE(IF(is_data_present = 1, date, NULL) IGNORE NULLS) OVER (ORDER BY date) date_to_use,
FROM sample_table;
+------------+-----------------+-------------+
| date | is_data_present | date_to_use |
+------------+-----------------+-------------+
| 27/10/2022 | 1 | 27/10/2022 |
| 28/10/2022 | 1 | 28/10/2022 |
| 29/10/2022 | 0 | 28/10/2022 |
| 30/10/2022 | 0 | 28/10/2022 |
+------------+-----------------+-------------+