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

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
Amit 6 Мар 2019 в 09:29

1 ответ

Лучший ответ

Предполагая, что у вас есть -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
0
Gordon Linoff 6 Мар 2019 в 12:52