Учитывая следующую таблицу:

id (desc) | amount
------------------
9         | 3 
8         | 2
7         | 1 <- RETURN THIS ROW
6         | 0
5         | 1
4         | 0
3         | 2
2         | 1
1         | 0

Мне нужно вернуть только одну строку - ту, что с id 7

Правила: - самая последняя запись имеет сумму больше 0 - должна возвращать строку после первого вхождения суммы 0

Таким образом, если у меня есть:

id (desc) | amount
------------------
4         | 0
3         | 0
2         | 1
1         | 0

Он не будет показывать ни одной строки.

0
aamuller 17 Апр 2020 в 16:20

1 ответ

Вы можете использовать оконные функции:

select t.*
from (select t.*,
             max(case when amount = 0 then id end) over () as last_0_id
      from t
     ) t
where id > last_0_id
order by id asc
limit 1;

Или без оконных функций:

select t.*
from t join
     (select max(t2.id) as id
      from t t2
      where t2.amount = 0
     ) t2
     on t.id > t2.id
order by id asc
limit 1;

Вот скрипт <>db

На самом деле это, вероятно, быстрее, чем использование lead().

0
Gordon Linoff 17 Апр 2020 в 16:45
. . . Это не вернет никакого результата.
 – 
Yogesh Sharma
17 Апр 2020 в 16:34
. . . Я понимаю. Идентификаторы идут в неправильном направлении. Я исправил ответ.
 – 
Gordon Linoff
17 Апр 2020 в 16:39