微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PostgreSQL – 如何创建具有条件的窗口框架?

假设我有下表:

CREATE TABLE stock_prices (
  stock TEXT NOT NULL,date  DATE NOT NULL,price REAL NOT NULL,UNIQUE (stock,date)
);

我想计算每一天,前3个月窗口中每只股票的最高价格.

我不能做一个简单的自我加入日期 – INTERVAL(3’MONTH’),因为我的stock_price表有一些假期和周末的“漏洞”.同样,一个天真的窗口也不起作用:

SELECT
  stock,date,LAST_VALUE(price) OVER (PARTITION BY stock ORDER BY date ROWS 90 PRECEDING)
FROM stock_prices

我几乎想要一个窗框,这里有一个基于当前行的条件.这可能在Postgresql中吗?

解决方法

您可以使用函数generate_series()填充缺少行的表,因此窗口函数将返回正确的数据.您可以在generate_series()中选择指定开始日期和结束日期的报告周期:

select
    stock,price,max(price) over (partition by stock order by date rows 90 preceding)
from (
    select d::date as date,s.stock,sp.price
    from generate_series('2016-01-01'::date,'2016-07-28','1d') g(d)
    cross join (
        select distinct stock
        from stock_prices
    ) s
    left join stock_prices sp on g.d = sp.date and s.stock = sp.stock
) s
order by 1,2;

这个替代解决方案带有一个简单的子查询

select 
    stock,(
        select max(price)
        from stock_prices sp2
        where sp2.stock = sp1.stock
        and sp2.date >= sp1.date- interval '90days' 
        and sp2.date <= sp1.date
    ) highest_price
from 
    stock_prices sp1
order by 1,2;

会贵得多.在这种情况下,您应该强制使用索引

create index on stock_prices (stock,date);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐