PostgreSQL – 如何创建具有条件的窗口框架?
发布时间:2020-12-13 16:01:54 所属栏目:百科 来源:网络整理
导读:假设我有下表: CREATE TABLE stock_prices ( stock TEXT NOT NULL,date DATE NOT NULL,price REAL NOT NULL,UNIQUE (stock,date)); 我想计算每一天,前3个月窗口中每只股票的最高价格. 我不能做一个简单的自我加入日期 – INTERVAL(3’MONTH’),因为我的stoc
假设我有下表:
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); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |