我有一张表,用于存储每件商品的每日价格。如果价格尚未更新,则当天没有该商品的记录。
我需要编写一个查询,为每个商品检索最新价格,并具有从当前行日期起 10 天的回溯窗口,否则返回NULL
。我想用一个来实现这一点RANGE BETWEEN INTERVAL
陈述。就像是:
SELECT
DATE(datetime),
item_id,
LAST(price) OVER(
PARTITION BY item_id
ORDER BY datetime DESC
RANGE BETWEEN INTERVAL '10 DAYS' AND CURRENT ROW
) AS most_recent_price_within_last_10days
FROM ...
GROUP BY
date,
item_id,
price
不幸的是这个查询引发了一个错误:
LINE 20: RANGE BETWEEN INTERVAL '10 DAY' PRECEDING AND CURRENT ROW
^
我看到一篇旧博客文章说这样的操作在 Postgres 中是不可能的。这仍然准确吗?
您可以使用 ROW_NUMBER() 提取每个项目在过去 10 天内的最新记录:
SELECT *
FROM (
SELECT
DATE(datetime),
item_id,
price AS most_recent_price_within_last_10days,
ROW_NUMBER() OVER(PARTITION BY item_id ORDER BY datetime DESC) rn
FROM ...
WHERE datetime > NOW() - INTERVAL '10 DAY'
) x WHERE rn = 1
在子查询中,WHERE子句对日期范围进行过滤; ROW_NUMBER() 为具有相同 item_id 的记录组中的每个记录分配一个排名,最新的记录在前。然后,外部查询仅过滤行号为 1 的记录。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)