sql - PostgreSQL:间隔 '10 DAY' 和当前行之间的范围

标签 sql postgresql range window-functions

我有一个表,用于存储每件商品的每日价格。如果价格尚未更新,则当天该商品没有记录。

我需要编写一个查询,为每个商品检索最新价格,回溯窗口为从当前行日期起 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 的记录。

关于sql - PostgreSQL:间隔 '10 DAY' 和当前行之间的范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55171060/

相关文章:

SQL-Server 无限循环

PostgreSQL 优化 : Sequantial Scan VS Index Scan

java - GWT + Postgres 教程

range - 使用 U-SQL 在日期范围内生成日期

javascript - 在 Internet Explorer 中添加对隐藏元素的选择会引发错误

python - Maya 脚本编辑器中的执行行范围

mysql - SQL Group by Subquery 被忽略

mysql - 批处理使用输入值更新查询

php - 如何使用 Laravel 5.1 执行原始查询?

postgresql - Heroku dev Postgres 数据库行限制/最大行