我有一张这样的桌子:
日期 | 团队名字 | 价值 |
---|---|---|
2022-01-01 | 一个 | 1.0 |
2022-01-15 | 一个 | 0.5 |
2022-01-31 | 一个 | 0.2 |
但这仅包含 3 天。我需要一个包含完整日历日期的表格,一年中的每一天都有一行,其中值是最后一个可用的。
例如,从 2022 年 1 月 1 日到 1 月 14 日的所有记录都具有值 1.0(范围为group_name
“A”)。
我试过使用LAST_VALUE()
,但它不工作。
WITH dates AS (
SELECT
date::date
FROM generate_series ( '2022-01-01'::timestamp, '2022-01-31'::timestamp, '1 day'::interval) date
), incomplete_table AS (
SELECT * FROM (VALUES
('2022-01-01'::date, 'a', 1),
('2022-01-15'::date, 'a', 0.5),
('2022-01-31'::date, 'a', 0.2),
('2022-01-02'::date, 'b', 0.1),
('2022-01-10'::date, 'b', 0.15),
('2022-01-20'::date, 'b', 0.15)
) AS t (date,group_name, value)
)
SELECT
dates.date,
group_name,
value,
LAST_VALUE(value) OVER (ORDER BY dates.date DESC) as last_value_window
FROM dates
LEFT JOIN incomplete_table ON incomplete_table.date = dates.date
ORDER BY dates.date DESC;
假设您想要每天一行和组名:
db<>在这里摆弄
① 如果可用,请使用提供不同组名的“组”表。快点。否则,如果表很大,请考虑模拟索引跳过扫描。看:
② 对最新值的搜索不限于给定的时间范围,除非您在
LATERAL
子查询中明确说明。关于LATERAL
:您仍然可以
value IS NULL
找到未找到早期值的位置。如果
incomplete_table
很大,则索引将(group_name, date)
有助于性能(很多)。甚至可能是一个“覆盖”索引,添加 columnvalue
。看:非常相似的案例,有更多解释: