Select Data Where Data have value below Current Value

hooman182 :

I have Data

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

expected result :

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 and sks_sum increased every year
i have try

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

but result still same.
thanks in advance

GMB :

You can use window functions - if your version of MySQL / MariaDB supports them: this is a good use case for window sums.

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

Demo on 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

In earlier versions, here is one approach using correlated subqueries:

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

For performance, consider an index on (user, year, indeks_sum) and another on (user, year, sks_sum).

Demo

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=298185&siteId=1
Recommended