所以我正在使用一张工具表和他们历史性的收盘价,我试图在未来的收盘价中以一个任意天数匹配一天。为此,我尝试使用带有生成系列索引的前导函数。
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是所需的最大前瞻。但是,对于任何非平凡的系列结果,都会出现相同的重叠前导结果。