Postgresql 分区依据-如何正确使用以获取相关行
: 我使用postgresql 13,我确信我了解如何使用分区,但我想我错了。我创建了以下示例来说明我的问题 我创建了这个表:Postgresql 分区依据-如何正确使用以获取相关行,postgresql,partition-by,Postgresql,Partition By,: 我使用postgresql 13,我确信我了解如何使用分区,但我想我错了。我创建了以下示例来说明我的问题 我创建了这个表: id, group_id,order_id,text 1 1 1 a1 2 1 2 b1 3 2 1 a2 4 2 2 b2 5 3 1 a3 所以你有唯一的id,组id,每个组的顺序,还有一个文本 我想选择o
id, group_id,order_id,text
1 1 1 a1
2 1 2 b1
3 2 1 a2
4 2 2 b2
5 3 1 a3
所以你有唯一的id,组id,每个组的顺序,还有一个文本
我想选择order_id为1的每一行,这样我就有了每个组的第一行,还可以获取每个组最后一个order_id的文本
所以我运行了这个查询:
select id,group_id,order_id,the_text,
last_value(the_text) over (partition by group_id order by order_id) last_text
from cdrs.my_test
where order_id=1;
它回来了
id,group_id,order_id,the_text,last_text
1,1,1,a1,a1
3,2,1,a2,a2
5,3,1,a3,a3
last_text和the_text是相同的,无论我选择first_value还是last_value
最后一个_文本列应返回b1、b2、a3
我确信当我得到一行时,我可以使用partitionby将该行与规则分组,并从组中的其他行获取数据
我真的不明白为什么它不起作用
如能提供有关此问题的任何信息,将不胜感激
致意
Kfir
窗口函数在WHERE子句之后应用。因此,您无法获取最后一个值,因为您刚刚删除了它们。您可以通过子查询对此进行查询:
SELECT
*
FROM (
SELECT
*,
first_value(order_id) OVER (PARTITION BY group_id ORDER BY order_id),
first_value(t) OVER (PARTITION BY group_id ORDER BY order_id DESC)
FROM
t
) s
WHERE order_id = 1
我会在这里使用行号,两次:
以cte为例
选择*,
分区上的行数按组\u id按顺序\u id rn\u min,
分区上的行数按组\u id按顺序\u id DESC rn\u max
从cdrs.my_测试
选择id、组id、订单id、文本
来自cte
其中rn_min=1或rn_max=1
按组id排序的订单,订单id;
注意:
注意,FieldSt值、LaSTyx值和NthyValm仅考虑 “窗口框架”中的行,默认情况下包含这些行 从分区的开始到当前分区的最后一个对等点 一行这可能会对最后的_值和 有时也有n次方值。可以通过添加 适当的机架规格范围、行或组至以上 条款有关框架的更多信息,请参见第4.2.8节 规格
因此,您需要在无界的前一行和无界的后一行之间添加类似的行,但随后您需要将筛选器移动到外部选择,否则它将在将行视为窗口的一部分之前删除这些行select * from (select id,group_id,order_id,the_text,
last_value(the_text) over (partition by group_id order by order_id rows between current row and unbounded following) last_text
from my_test)foo where order_id=1;
非常感谢。我已经试过了。结果完全一样。@ufk啊,误解了你的问题。写了一个新的答案。希望能帮上忙谢谢这就是问题所在,我不知道申请后在哪里: