【问题标题】:How can I calculate the change percentage between the current and the previous row in Postgres?如何计算 Postgres 中当前行和上一行之间的变化百分比?
【发布时间】:2020-11-13 18:24:20
【问题描述】:

我有一个名为 bookings 的表格,其中包含以下列:

开始时间(时间戳)

插槽(整数)

我想总结按天分组的预订时段,然后计算与前一天相比的变化百分比。

这个查询几乎可以做到这一点,但由于某种原因,百分比不正确:

SELECT starttime::date AS "Dates", SUM(slots) AS "Slots", 
(SUM(Slots)/LAG(SUM(Slots)) OVER (ORDER BY starttime::date))::NUMERIC(3,2) AS "Change (%)"
FROM cd.bookings
GROUP BY 1;

这是输出:

DATES        Slots  Change(%)
"2012-07-03"    10  NULL
"2012-07-04"    22  2.00
"2012-07-05"    19  0.00
"2012-07-06"    23  1.00
"2012-07-07"    42  1.00
"2012-07-08"    36  0.00
"2012-07-09"    43  1.00

我做错了什么?

【问题讨论】:

  • 整数除法。将总和转换为 double precision 之类的数据类型。

标签: sql postgresql group-by


【解决方案1】:

在除法之前转换为非整数:

SELECT starttime::date AS "Dates", SUM(slots) AS "Slots", 
       (SUM(Slots) * 1.0 /
        LAG(SUM(Slots)) OVER (ORDER BY starttime::date)
        )::NUMERIC(3,2) AS "Change (%)"
FROM cd.bookings
GROUP BY 1;

当两个操作数都是整数时,Postgres 会进行整数除法,因此 0/1 是 0 而不是 0.5。

【讨论】:

    猜你喜欢
    • 2017-03-13
    • 1970-01-01
    • 2021-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-09
    相关资源
    最近更新 更多