sql - Postgresql 中连续相同符号行的总和

标签 sql postgresql group-by window-functions cumulative-sum

假设下表:

date   |  user    |   amount
-----------------------------
01-01  |  John    |       +3
01-02  |  John    |       +2
01-03  |  John    |       +1
01-04  |  John    |       -5
01-05  |  John    |       +1
01-01  |  Jack    |       +2
01-02  |  Jack    |       -1
01-03  |  Jack    |       -6

对于每个用户,按用户对金额进行分组并签名并将总和应用于具有相同符号的连续金额的方法是什么?为了给出这个输出:

date   |  user    |   amount
-----------------------------
01-01  |  John    |       +6  <- this is the sum of all consecutive same sign
01-04  |  John    |       -5
01-05  |  John    |       +1
01-01  |  Jack    |       +2
01-02  |  Jack    |       -7  <- this is the sum of all consecutive same sign

我尝试过使用窗口函数,但我能得到的最接近的是:

select
    sum(amount) over (partition by user, sign(amount) order by date)
from my_table

这不会导致所需的输出。

最佳答案

您可以使用LAG()窗口函数来检查先前金额是否与当前金额具有相同的符号,并创建一个 bool 标志,您可以将其与 SUM() 一起使用窗口函数创建具有相同符号的连续组然后聚合:

SELECT MIN(date) date,
       "user",
       SUM(amount) amount
FROM (       
  SELECT *, SUM(flag) OVER (PARTITION BY "user" ORDER BY date) grp
  FROM (
    SELECT *, COALESCE(SIGN(amount) <> LAG(SIGN(amount)) OVER (PARTITION BY "user" ORDER BY date), true)::int flag 
    FROM my_table
  ) t  
) t 
GROUP BY "user", grp
ORDER BY "user", date;

请参阅demo .

关于sql - Postgresql 中连续相同符号行的总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73474048/

相关文章:

mysql - SQL:每个 GROUP BY 增量

python - 分组依据,在 Pandas 中

Mysql:仅连接表左表的第一行

sql - 在 SQL 数据库中存储纬度和经度数据时使用什么数据类型?

python - 从 3 个不同的 pandas 数据框中查找相同的行,其中行的排序不相似

java - 更新批处理存储 jooq 上唯一约束的记录

postgresql - Postgres 对一个非常简单的 SELECT x ... ORDER BY x 进行 Seq Scan 而不是 Index Only Scan

sql - 是否有 postgres CLOSEST 运算符?

c# - 如何优化 linq 查询以在不合并结果的情况下按价格对日期进行分组

mysql - 是否可以使用另一个包含查询表本身的嵌套查询来更新表的结果?