sql - 我想为列上的运行值添加总和,但如果序列失败,那么我们不必添加

标签 sql hadoop hiveql impala

我有这样的 table

+----+--------+------+------+
| id | state  | num  | pop  |
+----+--------+------+------+
|  1 | ny     |    1 |  100 |
|  1 | ny     |    2 |  200 |
|  1 | ny     |    3 |  600 |
|  1 | ny     |    6 |  400 |
|  1 | ny     |    7 |  300 |
|  1 | ny     |   14 | 1000 |
|  2 | nj     |    3 |  250 |
+----+--------+------+------+

我想要输出如下
+---+----+----+------+------+
| 1 | ny |  1 |  100 |  900 |
| 1 | ny |  2 |  200 |  900 |
| 1 | ny |  3 |  600 |  900 |
| 1 | ny |  6 |  400 |  700 |
| 1 | ny |  7 |  300 |  700 |
| 1 | ny | 14 | 1000 | 1000 |
| 2 | nj |  3 |  250 |  250 |
+---+----+----+------+------+

因此,如果 num 列中有 seq,那么我们必须添加 pop 列。所以前 3 列 num 列有 1,2,3 是按顺序排列的,所以我们添加 pop 列 100+200+600 并显示为新列。

我尝试了下面的代码,但没有收到想要的输出
select id, state,num, pop,
sum(pop) over (partition by id, state order by num )
from table

最佳答案

如果减去一个序列,则对于一行中的值,这些值将是恒定的。然后你可以使用窗口函数:

select t.*,
       sum(pop) over (partition by state, num - seqnum) as new_population
from (select t.*,
             row_number() over (partition by state order by num) as seqnum
      from t
     ) t;

Here是一个 db<>fiddle(使用 Postgres)。

关于sql - 我想为列上的运行值添加总和,但如果序列失败,那么我们不必添加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60675376/

相关文章:

sql - 方括号在表达式中按预期运行

SQL 优化 - 执行计划根据约束值更改 - 为什么?

SQL - 如何选择值 A 而不是 B 的记录? (A和B属于不同行)

sql - 是否有可用于 SQL 的 BNF 语法?

performance - 自定义映射器和 Reducer 与 HiveQL

hadoop - Oracle 一致性和 Hadoop HDFS 之间有什么区别

mongodb - Hadoop 错误 - 无法计算输入拆分 : need to login

hadoop - AWS EMR 上的 YARN 日志聚合 - UnsupportedFileSystemException

Hive如何限制collect_set中的条目数

mysql - 如何将配置单元日期转换为以下格式 : from 2016-11-28 to 28-Nov-16?