Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 分区依据-如何正确使用以获取相关行_Postgresql_Partition By - Fatal编程技术网

Postgresql 分区依据-如何正确使用以获取相关行

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

:

我使用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,每个组的顺序,还有一个文本

我想选择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啊,误解了你的问题。写了一个新的答案。希望能帮上忙谢谢这就是问题所在,我不知道申请后在哪里: