【发布时间】:2021-07-16 19:26:18
【问题描述】:
对于每一行,我想取最后 20 个非空值的平均值。
窗口函数取下面的 20 行,包括空行并计算平均值,而我想要最后 20 个非空行的平均值。
我尝试了什么?
WITH adv_calculated AS (
SELECT security_id AS sec_id,
date AS pd,
AVG(volume)
OVER (PARTITION BY (security_id) ORDER BY date ROWS BETWEEN 20 PRECEDING AND CURRENT ROW) AS adv
FROM tbl_financial_index_data
WHERE volume IS NOT NULL
GROUP BY security_id, date
)
UPDATE tbl_financial_index_data
SET adv = amc.adv
FROM adv_calculated amc
WHERE amc.sec_id = security_id
AND amc.pd = date
此解决方案适用于 volume 不为 null 的所有行,但它不会计算 volume 为 NULL 的行的 adv/average。 然后对于 null adv 和 volume 行,我必须运行这个非常慢的查询
UPDATE tbl_financial_index_data
SET average_daily_volume =
(SELECT avg(t.volume)
FROM (
SELECT a.volume
FROM tbl_financial_index_data a
WHERE a.security_id = tbl_financial_index_data.security_id
AND a.date::date <= tbl_financial_index_data.date::date
AND a.volume IS NOT NULL
ORDER BY a.date DESC
LIMIT 21
) t)
WHERE volume IS NULL;
我想避免使用第二个查询并使用第一个查询计算所有行的 ADV(因为它要快得多)。
【问题讨论】:
标签: sql postgresql