Postgresql выбирает первый элемент последней группы - PullRequest
0 голосов
/ 06 марта 2019

У меня есть эти данные:

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 голосов
/ 06 марта 2019

Предполагая, что у вас есть -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
...