假设下表:
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/