问题描述
|
假设我有以下表格列
日期
时间
安全
交易价格
对于每个日期,我希望获得该特定日期交易的每种证券的首个和最后一个交易价格。如何在sql中执行此操作?
解决方法
Postgresql的窗口函数提供了几种获取所需内容的方法。我还没有足够的使用它们来知道哪些(如果有的话)最细微的变体是最佳优化的,但是一个版本是
SELECT dt,sec,t0,p0,t1,p1 FROM
(
SELECT dt,first_value(tm) over date_window as t0,first_value(price) OVER date_window AS p0,last_value(tm) OVER date_window AS t1,last_value(price) OVER date_window AS p1,rank() OVER date_window AS r
FROM a
WINDOW date_window AS (PARTITION BY dt,sec ORDER BY tm
RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
) AS subquery
WHERE r=1;
我更改了字段名称以避免保留字。
,尝试
Select Coalesce(f.Security,l.Security) security.
Coalesce(f.Date,l.Date) Date,f.TradePrice firstPrice,l.TradePrice lastPrice
From table f Full Join table l
On f.Security = l.Security
And f.Date = l.Date
And f.time = (Select Min(Time)
From table
Where Security = f.security
And Date = f.Date)
And l.Time = (Select Max(Time)
From table
Where Security = l.security
And Date = l.Date)