Sql 使用';由'进行的产权转让;和窗口函数返回postgres中的多行?
:) 我正在学习Postgresql,使用11.4版 我的表格中有一些行通过它们的公共id(让我们调用列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
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;