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

如何按city_id和street_id分组计算客户price的占比列?

问题描述

现有cust表结构及数据如下:

rncust_idpricestreet_idcity_id
12468100116
21234200116
35678300116
478902059
523467059
645321059

需求说明

需要新增percentile列,计算规则为:每条记录的price除以同一city_id和street_id分组下的price总和,示例计算:

  • 100/(100+200+300) = 0.16667
  • 200/(100+200+300) = 0.33333
  • 300/(100+200+300) = 0.500

期望输出

rncust_idpricestreet_idcity_idpercentile
124681001160.16667
212342001160.33333
356783001160.50
4789020590.2
5234670590.7
6453210590.1

尝试过使用percentile函数但未成功,寻求可行实现方案。

解决方案

你用错函数了,percentile是用来计算分位数的,和你的需求不匹配。正确的做法是用窗口函数计算分组内的总价,再用当前行price除以该总价即可,以下是主流SQL数据库的实现:

支持窗口函数的数据库(MySQL 8.0+/PostgreSQL/SQL Server等)

SELECT 
    rn,
    cust_id,
    price,
    street_id,
    city_id,
    ROUND(price / SUM(price) OVER (PARTITION BY city_id, street_id), 5) AS percentile
FROM cust;

代码说明

  • SUM(price) OVER (PARTITION BY city_id, street_id):计算每个city_id+street_id分组的总价,窗口函数会把这个总价匹配到分组内的每一行
  • ROUND(...,5):按需求保留小数位数,可根据实际情况调整

不支持窗口函数的数据库(如MySQL 5.x)

用子查询关联分组总价:

SELECT 
    c1.rn,
    c1.cust_id,
    c1.price,
    c1.street_id,
    c1.city_id,
    ROUND(c1.price / c2.group_total, 5) AS percentile
FROM cust c1
JOIN (
    SELECT city_id, street_id, SUM(price) AS group_total
    FROM cust
    GROUP BY city_id, street_id
) c2 ON c1.city_id = c2.city_id AND c1.street_id = c2.street_id;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 04:20:24