这是我的数据库的简化 ER 图:
我想要检索的是,对于每个vendor_item:
- 最高价格(不包括最后一次捕获)
- 最低价格(不包括最后一次捕获)
- 当前价格(即最后一次捕获)
这是 PRICE_DATA
的一些示例数据表格给你一个想法:
这是我到目前为止的 SQL 语句:
select distinct vendor_item_id
,last_value(price) over win as curr_price
,min(price) over win as low_price
,max(price) over win as high_price
from price_data
window win as (partition by vendor_item_id
order by capture_ts
rows between unbounded preceding
and unbounded following);
虽然这或多或少地满足了我的需求,但存在一些问题:
最高和最低价格考虑所有记录,而不是排除最近捕获的记录。
如果我不添加
distinct
对于查询,我最终得到了重复的记录(这可能是我的错,因为未能正确掌握窗口功能)。
期望的结果:
感谢您的帮助!
最佳答案
使用为每个 vendor_item_id
返回最大 capture_ts
的 CTE,然后根据条件获取 low_price
和 high_price
聚合:
WITH cte AS (
SELECT *, MAX(capture_ts) OVER (PARTITION BY vendor_item_id) max_capture_ts
FROM price_data
)
SELECT DISTINCT vendor_item_id,
FIRST_VALUE(price) OVER (PARTITION BY vendor_item_id ORDER BY capture_ts DESC) curr_price,
MIN(CASE WHEN capture_ts < max_capture_ts THEN price END) OVER (PARTITION BY vendor_item_id) low_price,
MAX(CASE WHEN capture_ts < max_capture_ts THEN price END) OVER (PARTITION BY vendor_item_id) high_price
FROM cte;
请参阅demo .
关于SQLite 窗口函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71411033/