【问题标题】:SQL query that increments a field by the previous number in that field将字段增加该字段中的前一个数字的 SQL 查询
【发布时间】:2012-08-02 10:52:47
【问题描述】:

首先,这是我关于该问题的第一个问题:SQL request to group and sum numbers by their day of creation

现在,想象一下我想让它变得更复杂,经过之前的操作并感谢答案,我有按天分组的结果,因此添加了当天的每个条目。我有这个:

1 | 200 | 2010-01-01
2 | 100 | 2010-01-01

变成这样:

1 | 300 | 2010-01-01

这已经很不错了,但是如果我希望金额字段每次都增加呢?

1 | 300 | 2010-01-01
2 | 200 | 2010-01-02

会变成:

1 | 300 | 2010-01-01
2 | 500 | 2010-01-02
x | (previous amount + this amount) | this date

感谢上一个问题的答案,我得到的 sql 查询:

select sum(amount), to_char(date, 'YYYY-MM-DD') 
from mytable 
group by to_char(date, 'YYYY-MM-DD') 
order by sum(amount) ASC;

【问题讨论】:

    标签: sql postgresql


    【解决方案1】:

    可以使用窗口函数完成运行总和:

    select sum(amount) over (order by date asc), 
           to_char(date, 'YYYY-MM-DD') 
    from mytable 
    order by date ASC;
    

    如果您想要聚合结果的运行总和,只需将其放入子查询中:

    select sum(day_total) over (order by date) as running_total,
           day_total, 
           date
    from (
      select sum(amount) as day_total, 
             date
      from mytable 
      group by date
    ) t
    order by date
    

    如果date 列的实际数据类型为date,则没有理由对其使用to_char()。顺便说一句:对列名使用保留字 (date) 并不是一个非常好的主意。

    这里重要的是order by 作为over 定义的一部分。

    手册中的更多详细信息:http://www.postgresql.org/docs/current/static/tutorial-window.html

    【讨论】:

    • 此查询获取所有记录。它不会对金额进行分组和汇总
    • 这部分工作,因为不再按天计算总和。我得到了有效的运行总和,但如果我每天有两个条目,那么这些总和是相同的。 1|300|2010-01-01 2|300|2010-01-01 3|600|2010-01-02 而不是:1|300|2010-01-01 2|600|2010-01-02 不用说这是我目前的 sql 技能 ^^'
    【解决方案2】:

    这是一个总和。

    看看following question。 Quassnoi 的回答考虑了 PostgreSQL。

    【讨论】:

    • 感谢您的澄清,我不确定我是否理解那里所说的内容,也许我会使用更简单但草率的方式来做。
    【解决方案3】:

    试试这个:

     select date,(select sum(amount)
                        from mytable11 T1 
                        where T1.date<=T2.date
                        )as cum_sum
    from mytable11 T2
    group by date
    

    【讨论】:

    • 很抱歉,我没有设法调整您的查询,它说 cum_sum 不存在。上述解决方案虽然有效,但我猜它与您的机制几乎相同。
    • [date] 不是 Postgres 的有效语法
    • @Alex: 我在 sql server 中做过这个,抱歉我不知道 postgressql
    • 我知道,我刚刚将我的 var 翻译成英文,所以它在 stackoverflow 上可以理解,我真正的 var 不是日期。
    猜你喜欢
    • 1970-01-01
    • 2021-05-13
    • 2012-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-22
    • 1970-01-01
    相关资源
    最近更新 更多