SQL: считать последние равные значения - PullRequest
0 голосов
/ 30 мая 2019

Мне нужно решить эту проблему в чистом SQL: мне нужно посчитать все записи с определенным значением: в моей таблице есть флаг столбца со значениями 0 или 1. Мне нужно посчитать все 1 после последнего 0 иСуммируйте значения столбцов суммы этих записей.

Пример:

Flag | Amount

0    | 5
1    | 8
0    | 10
1    | 20
1    | 30

Вывод:

2    | 50

Если последнее значение равно 0, мне ничего не нужно делать,Я спешу, что мне нужно выполнить быстрый запрос (возможно, доступ только один раз).

Ответы [ 3 ]

1 голос
/ 30 мая 2019

Я предположил, что ваш пример таблицы логически упорядочен по сумме. Тогда вы можете сделать это:

select
     count(*) as cnt
    ,sum(Amount) as Amount
from yourTable
where Amount > (select max(Amount) from yourTable where Flag = 0)

Если наибольшее значение из строки where Flag = 0, то ничего не будет возвращено.

0 голосов
/ 03 июня 2019

Я нахожу решение самостоятельно:

select decode(lv,0,0,tot-prog) somma ,decode(lv,0,0,cnt-myrow) count
from(
select * from
(
        select pan,dt,flag,am, 
        last_value(flag) over() lv, 
        row_number() OVER (order by dt) AS myrow,
        count(*) over() cnt,
        case when lead(flag) OVER (ORDER BY dt) != flag then rownum  end AS change,
        sum(am) over() tot,
        sum(am) over(order by dt) prog
        from test
        where   pan=:pan and dt > :dt and flag is not null
        order by dt
        ) t 
where change is not null        
order by change desc
) where rownum =1
0 голосов
/ 30 мая 2019

Если ваша таблица может не содержать каких-либо нулей, тогда вы безопаснее:

select count(*) as cnt, sum(Amount) as Amount
from t
where Amount > all (select Amount from t where Flag = 0)

Или, используя оконные функции:

select count(*) as cnt, sum(amount) as amount
from (select t.*, max(case when flag = 0 then amount end) as flag0_amount
      from t
     ) t
where flag0_amount is null or amount > flag0_amount 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...