sql - 如何计算 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
我究竟做错了什么?
解决方案
除法前转换为非整数:
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。
推荐阅读
- node.js - 在 WebStorm 中使用 Node.js 和 Flow
- android - 查看寻呼机上的多个页面
- python - 如何理解这个 LSTM 示例?
- android - Android Gradle v 3.1.3 更新将应用启动器图标设为默认
- c# - 模型绑定到可变长度列表
- android - Android Studio 运行“应用程序”,但我找不到任何设备
- c# - 读取角度 6 中来自 asp.net 核心的响应的状态代码
- python - Python Tkinter:为什么“1.end”有效但“2.0”无效?
- django - 个人数据的 Django REST Framework 完整序列化
- c++ - 'char (*RtlpNumberOf(T (&)[N]))[N]': 无法从 'char *' 推导出 'T (&)[N]' 的模板参数