首页 > 解决方案 > 如何计算 Postgres 中当前行和上一行之间的变化百分比?

问题描述

我有一个名为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

我究竟做错了什么?

标签: sqlpostgresqlgroup-by

解决方案


除法转换为非整数:

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。


推荐阅读