Sql 使用';由'进行的产权转让;和窗口函数返回postgres中的多行?

Sql 使用';由'进行的产权转让;和窗口函数返回postgres中的多行?,sql,postgresql,window-functions,Sql,Postgresql,Window Functions,:) 我正在学习Postgresql,使用11.4版 我的表格中有一些行通过它们的公共id(让我们调用列common\u id)和方向(1或2)与其他行相关 每个common\u id可以而且必须只有一个方向1,从方向2可以有0到10行 这个表很大,所以我不想加入同一个表,我有两个场景,我解决了一个。。没有解决另一个问题 假设我有下表: common_id | direction | price | time 1 1 0 1 2

:)

我正在学习Postgresql,使用11.4版

我的表格中有一些行通过它们的公共id(让我们调用列
common\u id
)和方向(
1
2
)与其他行相关

每个
common\u id
可以而且必须只有一个方向
1
,从方向
2
可以有0到10行

这个表很大,所以我不想加入同一个表,我有两个场景,我解决了一个。。没有解决另一个问题

假设我有下表:

common_id | direction | price | time 
1           1           0       1
2           1           1       4
2           2           2.5     5
3           1           5       8
3           2           7       10
3           2           10      12
因此,第一个场景是将方向为
1
的行连接到方向为2的行,并使用最新时间。当然,所有这些都在同一个
公共\u id

因此,这里我可以按方向,按公共id顺序进行
分区,无界前向和无界后向之间的时间范围
,如果
计数(1)
大于1,则
第一个值(
是方向
1的行,
最后一个值(
是方向
2
的行,如果没有,则没有方向
2

这就是结果:

common_id  | price_1 | time_1 | price_2 | time_2
1            0         1        null      null
2            1         4        2.5       5
3            5         8        10        12
这工作进展很快,我很高兴。所以这里对于每个
公共id
我有一行。但是,当我需要为每个分区多出一行时会发生什么呢

第二种情况是,我需要为每个
common\u id
获取方向为
2
的所有行,并使用方向为
1
的相同
common\u id
连接到行中的每一行

因此,这里的预期结果应该是:

common_id  | price_1 | time_1 | price_2 | time_2
2            1         4        2.5       5
3            5         8        7         10
3            5         8        10        12
我希望有一种方法可以通过分区来解决它,如果没有其他解决方案,但由于性能问题,我不能使用另一个连接到同一个表,因为它是一个非常大的表

我希望我能正确地解释我自己

谢谢

尝试此(未测试)查询:

SELECT common_id,
       price_1,
       time_1,
       price_2,
       time_2
FROM (SELECT common_id,
             direction,
             first_value(price) OVER w AS price_1,
             first_value(time) OVER w AS time_1,
             price AS price_2,
             time AS time_2
      FROM atable
      WINDOW w AS (PARTITION BY common_id
                   ORDER BY direction
                   ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
     ) q
WHERE direction = 2;