You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在PostgreSQL中用单查询实现每行除以子类别总计

单查询实现PostgreSQL按类别计算权重值

假设我们有一张名为table0的PostgreSQL表,结构及数据如下:

id | value | category
----+-------+----------
  0 |    10 | a
  1 |    11 | b
  2 |    50 | b
  3 |    20 | a

我们需要为每一行计算weight列,值为当前行的value除以其对应category下所有value的总和,最终结果如下:

id | value | category | weight
----+-------+----------+--------
  0 |    10 | a        | 0.3333
  1 |    11 | b        | 0.1803
  2 |    50 | b        | 0.8197
  3 |    20 | a        | 0.6667

如果用两次查询,我们可以先聚合每个类别的总和再关联原表,但单查询可以通过窗口函数直接实现,无需临时表或关联操作:

SELECT
    id,
    value,
    category,
    value::numeric / SUM(value) OVER (PARTITION BY category) AS weight
FROM table0;

关键说明:

  • SUM(value) OVER (PARTITION BY category) 是窗口函数,它会为每一行计算其所属category分组的value总和,不会改变原表的行结构(区别于普通GROUP BY会合并行的特性)。
  • 将value转为numeric类型是为了避免PostgreSQL的整数取整除法,确保得到精确的小数权重值。

内容的提问来源于stack exchange,提问作者Diego Alonso

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 02:48:30