【问题标题】:Select Data Where Data have value below Current Value选择数据值低于当前值的数据
【发布时间】:2020-03-13 15:00:11
【问题描述】:

我有数据

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_sumsks_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

但结果还是一样。
提前致谢

【问题讨论】:

  • WHERE `year` &lt;= year AND indeks_sum IS NOT NULL
  • 你的 where 子句无效,因为 year 总是小于或等于它自己。我怀疑您可能会从了解 HAVING 子句以及它与 WHERE 子句的区别中受益

标签: sql group-by sum mariadb window-functions


【解决方案1】:

您可以使用窗口函数 - 如果您的 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

Demo on DB Fiddle

用户 | indeks_sum | sks_sum |年 ---: | ---------: | ------: | ----: 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) 上建立另一个索引。

Demo

【讨论】:

  • #1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以了解在 'over(partition by user order by year)) sum_indeks, (sum(' at line 3
  • @hooman182: 你运行的是哪个版本的 MySQL?窗口函数仅在 MySQL 8.0 中可用。
  • @hooman182:好的。我用早期版本的解决方案编辑了我的答案。
  • @hooman182:为什么不升级到 MySQL 8.0?否则,我在答案中添加了索引建议。
  • 它由 WHM 提供。所以基本上它的免费版本。我只能在 mariadb 或 mysql GPL 之间进行选择。谢谢你的回答。它的作用就像一个魅力。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-07
相关资源
最近更新 更多