Oracle SQL 按ID计算工作日与周末消费占比的实现方案
按ID计算工作日/周末消费占比的Oracle SQL最优实现
实现思路
- 采用Oracle原生窗口函数
SUM() OVER(PARTITION BY id)计算每个ID的总消费金额,无需额外子查询或表关联,仅需一次表扫描即可完成计算,性能最优 - 取整逻辑可根据业务需求选择对应函数:四舍五入取整用
ROUND,截断取整用TRUNC,向上取整用CEIL
实现代码
假设源表名为user_daily_consume,字段分别为id(用户ID)、date_type(日期类型,值为weekday/weekend)、daily_amount(每日消费总额),SQL如下:
SELECT id, date_type, -- 四舍五入取整,若需其他取整规则替换ROUND即可 ROUND((daily_amount / NULLIF(SUM(daily_amount) OVER (PARTITION BY id), 0)) * 100) AS 对应占比 FROM user_daily_consume;
方案优势
- 性能最优:仅执行一次全表扫描,相比先分组计算ID总消费再关联原表的写法,减少了IO开销,大数据量表下优势尤其明显
- 容错性高:加入
NULLIF函数处理ID总消费为0的场景,避免出现除零报错- 易维护:代码逻辑简洁,调整取整规则或统计维度仅需修改少量代码
内容的提问来源于stack exchange,提问作者Sarah john
相关产品推荐
相关产品推荐

