Выберите данные, где данные имеют значение ниже текущего значения - PullRequest
1 голос
/ 13 марта 2020

У меня есть данные

user    indeks_sum    sks_sum    year
2000    76            21         20191
2000    NULL          21         20192 
2012    12            24         20191
2012    NULL           8         20192
2042    21            16         20191
2042    NULL           9         20192
2069    8              2         20191
2069    4              1         20192

ожидаемый результат:

user    indeks_sum    sks_sum    year
2000    76            21         20191
2000    76            42         20192 
2012    12            24         20191
2012    12            32         20192
2042    21            16         20191
2042    21            25         20192
2069    8              2         20191
2069    12             3         20192

indeks_sum и sks_sum увеличивается с каждым year
у меня есть попытка

select * user,sum(indeks_sum) as indeks_sum, sum(sks_sum) as sks_sum, year
from ips
where year <= year
group by user,year

но результат все тот же.
заранее спасибо

1 Ответ

2 голосов
/ 13 марта 2020

Вы можете использовать оконные функции - если ваша версия MySQL / MariaDB поддерживает их: это хороший вариант использования для оконных сумм.

select
    user,
    sum(indeks_sum) over(partition by user order by year)) indeks_sum,
    sum(sks_sum)    over(partition by user order by year) sks_sum,
    year
from ips
order by user, year

Демонстрация на DB Fiddle :

user | indeks_sum | sks_sum |  year
---: | ---------: | ------: | ----:
2000 |         76 |      21 | 20191
2000 |         76 |      42 | 20192
2012 |         12 |      24 | 20191
2012 |         12 |      32 | 20192
2042 |         21 |      16 | 20191
2042 |         21 |      25 | 20192
2069 |          8 |       2 | 20191
2069 |          4 |       3 | 20192

В более ранних версиях есть один подход, использующий коррелированные подзапросы:

select
    i.user,
    (select sum(i1.indeks_sum) from ips i1 where i1.user = i.user and i1.year <= i.year) indeks_sum,
    (select sum(i1.sks_sum)    from ips i1 where i1.user = i.user and i1.year <= i.year) sks_sum,
    i.year
from ips i
order by i.user, i.year

Для производительности рассмотрим индекс для (user, year, indeks_sum) и еще один на (user, year, sks_sum).

Демо

...