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 end
和move up
的位置?你的预期输出是什么?正如您所描述的,如果在您的表中找到 -1 值,它似乎只输出一行,或者如果在您的表中找不到 -1 则没有行?
@D-Shih 我们可以假设有一个行号列。我将它添加到示例数据中
@PhamX.Bach 我已将示例数据整理好。为了清楚起见,在示例中添加订单列
【参考方案1】:
假设您有-1
s,您可以通过计算后面的0
s 来对它们进行分组。然后可以使用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 选择最后一组的第一项的主要内容,如果未能解决你的问题,请参考以下文章