Postgresql 选择最后一组的第一项

Posted

技术标签:

【中文标题】Postgresql 选择最后一组的第一项【英文标题】:Postgresql selecting first item of last group 【发布时间】:2019-03-06 06:29:17 【问题描述】:

我有这些数据:

ID | Amount
1 | 0
2 | 0
3 | 0
4 | 0 ---> NULL

ID | Amount
1 | -1 ---> this row
2 | 0
3 | 0
4 | 0
5 | 0

ID | Amount
1 | 0
2 | 0
3 | -1 ---> this row
4 | 0
5 | 0
6 | 0
7 | 0

ID | Amount
1 | 0
2 | -1
3 | -1
4 | 0
5 | 0
6 | -1 ---> this row
7 | 0
8 | 0

ID | Amount
1 | 0
2 | -1
3 | 0
4 | 0
5 | 0
6 | -1 ---> this row
7 | -1
8 | 0

我的逻辑是从最后开始,然后向上移动,直到我们遇到第一个 -1。但是,我无法为此得出一个 SQL。任何帮助表示赞赏!

【问题讨论】:

有哪一列可以代表订单号? 表格数据是无序的,除非您明确地对它们进行排序(按一列或多列)。您如何对数据进行排序以定义the endmove up 的位置?你的预期输出是什么?正如您所描述的,如果在您的表中找到 -1 值,它似乎只输出一行,或者如果在您的表中找不到 -1 则没有行? @D-Shih 我们可以假设有一个行号列。我将它添加到示例数据中 @PhamX.Bach 我已将示例数据整理好。为了清楚起见,在示例中添加订单列 【参考方案1】:

假设您有-1s,您可以通过计算后面的0s 来对它们进行分组。然后可以使用dense_rank() 枚举这些:

select id, rnk
from (select t.*, dense_rank() over (partition by grp) as rnk
      from (select t.*,
                   count(*) filter (where amount = 0) over (order by id desc) as grp
            from t
           ) t
     ) t
where amount = -1 and rnk = 1
order by id
fetch first 1 row only;

要处理您的第一个案例,您可以在这样的查询中合并:

select id, rnk
from t
where not exists (select 1 from t where amount = -1)
order by id
fetch first 1 row only

【讨论】:

谢谢!我什至不知道这些功能的一半!这真的很有帮助!

以上是关于Postgresql 选择最后一组的第一项的主要内容,如果未能解决你的问题,请参考以下文章

在单个 SELECT 中获取某个组的第一项

赛马题

Postgres通过以下方式获取组的第一项

在Scala中为列表中的每一行获取元组的第一项

如何选择 Access Web 兼容表单中组合框的第一项?

CSS flex:行选择器中的最后一项和第一项