【问题标题】:Cumulative sum grouped by year, month and day in a JSON objectJSON对象中按年、月、日分组的累计和
【发布时间】:2020-10-21 07:18:00
【问题描述】:

假设我有一个表orders,其中包含以下行:

ID      Cost     Date (timestamp)
1       100      2020-06-30 21:18:53.328386+00
2       45       2020-06-30 11:18:53.328386+00
3       200      2020-05-29 21:32:56.620174+00
4       20       2020-06-28 21:32:56.620174+00

而且我需要一个返回完全正确的查询:

Month       Year       Costs
5           2020       {"1": 0, "2": 0, ..., "29": 200, "30": 200, "31": 200}
6           2020       {"1": 0, "2": 0, ..., "28": 20, "29": 20, "30": 165}

请注意,Costs 列必须是一个 json,键是当月中的某一天,值是该月所有前几天的累积总和。 我知道这可能不是 postgres 应该做的任务,但我只是想知道它的解决方案是什么(即使它在生产环境中不是最有效的)

【问题讨论】:

    标签: json postgresql date select count


    【解决方案1】:

    您可以使用两个级别的聚合和json_object_agg()

    select date_month, date_year, json_object_agg(date_day, cnt) costs
    from (
        select
            extract(month from date) date_month,
            extract(year from date) date_year,
            extract(day from date) date_day,
            sum(sum(cost)) over(
                partition by extract(month from date), extract(year from date)
                order by extract(day from date)
            ) cnt
        from mytable
        group by 1, 2, 3
    ) t
    group by date_month, date_year
    

    【讨论】:

    • 成本列中的结果必须是该月前几天的累积总和(正如我在问题中指出的那样)。此外,您在第二个“提取”中有错字:D
    • @InácioMattos:好的,我明白了。固定。
    • 应该编辑的另一件事是 sum(count(*)) 应该是 sum(sum(cost))。不管怎样,你解决了我的问题,所以谢谢你先生!
    猜你喜欢
    • 1970-01-01
    • 2018-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-07
    • 2011-02-25
    • 1970-01-01
    相关资源
    最近更新 更多