Postgres中如何为支付金额数据记录划分四分位数(Quartiles)
PostgreSQL实现支付金额四分位划分方案
你可以通过以下两种内置函数实现需求,可根据是否要求相近值同组选择方案:
方案1:NTILE窗口函数快速均分
直接将排序后的记录均分为4份,适合不需要严格保留相近值同组的场景:
SELECT id, payment, -- 按支付金额升序排列后均分为4组,拼接为Q1~Q4格式 'Q' || NTILE(4) OVER (ORDER BY payment ASC) AS "Quartile" FROM payment_records;
方案2:WIDTH_BUCKET等宽分箱(推荐,符合相近值同组要求)
该方法会先基于现有数据的支付金额范围自动划分4个等宽区间,数值接近的记录会自动归为同一组,不会被强制拆分到不同分位:
WITH payment_stats AS ( -- 先计算当前所有记录的支付金额上下限 SELECT MIN(payment) AS min_pay, MAX(payment) AS max_pay FROM payment_records ) SELECT id, payment, 'Q' || WIDTH_BUCKET(payment, min_pay, max_pay, 4) AS "Quartile" FROM payment_records, payment_stats;
小提示:如果出现最大值被分到Q5的异常情况,可将WIDTH_BUCKET的上限参数调整为
max_pay * 1.0001,即可避免边界值溢出问题。
自定义调整说明
如果需要手动指定分位分界阈值,可直接修改WIDTH_BUCKET的参数,无需通过CTE计算上下限,示例:
SELECT id, payment, 'Q' || WIDTH_BUCKET(payment, 0, 2500000, 4) AS "Quartile" FROM payment_records;
内容的提问来源于stack exchange,提问作者Aaron
相关产品推荐
相关产品推荐

