Postgresql 选择最后一组的第一项
Postgresql selecting first item of last group
我有这个数据:
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。感谢您的帮助!
假设您有 -1
个,您可以通过计算后面的 0
个来对它们进行分组。然后可以使用 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
我有这个数据:
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。感谢您的帮助!
假设您有 -1
个,您可以通过计算后面的 0
个来对它们进行分组。然后可以使用 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