Postgres带有系列索引的主窗口

时间:2017-09-28 13:12:34

标签: postgresql aggregate-functions

所以我正在使用一张工具表和他们历史性的收盘价,我试图在未来的收盘价中以一个任意天数匹配一天。为此,我尝试使用带有生成系列索引的前导函数。

select subq.*, lead(subq.close, x) over w, lead(subq.date, x) over w, x from 
  select instrument_id, close, timestamp::date as date from 
    instrument_data_daily order by instrument_id, date) as subq, 
  generate_series(2, 5) as x 
window w as (PARTITION BY instrument_id ORDER BY date);

然而,这提供了我认为不正确的结果:

 instrument_id |    close    |    date    |    lead     |    lead    | x 
---------------|-------------|------------|-------------|------------|---
           801 |    34499.96 | 2014-12-04 |    34499.96 | 2014-12-04 | 2
           801 |    34499.96 | 2014-12-04 |    31599.99 | 2014-12-05 | 3
           801 |    34499.96 | 2014-12-04 |    31599.99 | 2014-12-05 | 4
           801 |    34499.96 | 2014-12-04 |    28599.99 | 2014-12-08 | 5
           801 |    31599.99 | 2014-12-05 |    31599.99 | 2014-12-05 | 2
           801 |    31599.99 | 2014-12-05 |    28599.99 | 2014-12-08 | 3
           801 |    31599.99 | 2014-12-05 |    28599.99 | 2014-12-08 | 4
           801 |    31599.99 | 2014-12-05 |    25800.04 | 2014-12-09 | 5
           801 |    28599.99 | 2014-12-08 |    28599.99 | 2014-12-08 | 2
           801 |    28599.99 | 2014-12-08 |    25800.04 | 2014-12-09 | 3
           801 |    28599.99 | 2014-12-08 |    25800.04 | 2014-12-09 | 4
           801 |    28599.99 | 2014-12-08 |    23399.95 | 2014-12-10 | 5
           801 |    25800.04 | 2014-12-09 |    25800.04 | 2014-12-09 | 2
           801 |    25800.04 | 2014-12-09 |    23399.95 | 2014-12-10 | 3
           801 |    25800.04 | 2014-12-09 |    23399.95 | 2014-12-10 | 4
           801 |    25800.04 | 2014-12-09 |    21499.98 | 2014-12-11 | 5

请注意,索引3和4的提前日期相同。

基础查询生成一个没有重复项的表:

select instrument_id, close, timestamp::date as date from 
  instrument_data_daily order by instrument_id, date;

提供以下结果:

 instrument_id |    close    |    date    
---------------+-------------+------------
           801 |    34499.96 | 2014-12-04
           801 |    31599.99 | 2014-12-05
           801 |    28599.99 | 2014-12-08
           801 |    25800.04 | 2014-12-09
           801 |    23399.95 | 2014-12-10
           801 |    21499.98 | 2014-12-11
           801 |    23100.00 | 2014-12-12
           801 |    23300.04 | 2014-12-15

因此我们可以看到底层数据不包含重复的任何问题,并且生成的系列索引x是我期望它的位置。关于为什么窗口会拉错索引的任何想法?

(数据集被截断以适合示例,但它大约有25万行深,这使得连接变得昂贵。)

编辑:(为了清晰起见,添加预期结果) 但是,预期结果是每个日期与基于x索引的正确数量的铅配对,如下所示:(注意这是手动创建的,查询尚未更新)

 instrument_id |    close    |    date    |    lead     |    lead    | x 
---------------|-------------|------------|-------------|------------|---
           801 |    34499.96 | 2014-12-04 |    31599.99 | 2014-12-05 | 2
           801 |    34499.96 | 2014-12-04 |    28599.99 | 2014-12-08 | 3
           801 |    34499.96 | 2014-12-04 |    25800.04 | 2014-12-09 | 4
           801 |    34499.96 | 2014-12-04 |    23399.95 | 2014-12-10 | 5
           801 |    31599.99 | 2014-12-05 |    31599.99 | 2014-12-08 | 2
           801 |    31599.99 | 2014-12-05 |    25800.04 | 2014-12-09 | 3
           801 |    31599.99 | 2014-12-05 |    23399.95 | 2014-12-10 | 4
           801 |    31599.99 | 2014-12-05 |    21499.98 | 2014-12-11 | 5
           801 |    28599.99 | 2014-12-08 |    25800.04 | 2014-12-09 | 2
           801 |    28599.99 | 2014-12-08 |    23399.95 | 2014-12-10 | 3
           801 |    28599.99 | 2014-12-08 |    21499.98 | 2014-12-11 | 4
           801 |    28599.99 | 2014-12-08 |    23100.00 | 2014-12-12 | 5
           801 |    25800.04 | 2014-12-09 |    23399.95 | 2014-12-10 | 2
           801 |    25800.04 | 2014-12-09 |    21499.98 | 2014-12-11 | 3
           801 |    25800.04 | 2014-12-09 |    23100.00 | 2014-12-12 | 4
           801 |    25800.04 | 2014-12-09 |    23300.04 | 2014-12-15 | 5

我们实际上应该将生成的系列更新为1到x,其中x是所需的最大前瞻。但是,对于任何非平凡的系列结果,都会出现相同的重叠前导结果。

0 个答案:

没有答案