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

如何在PostgreSQL中实现指定阈值分箱数据列创建

你给出的分箱逻辑分界点为 0, 30, 200, 500, 1000, num_subjects_enrolled字段全局最大值,区间规则为左开右闭,和示例中583 → 500 <x ≤ 1000的效果完全匹配,以下是可直接使用的PostgreSQL实现:

方案1:硬编码边界(适合已知数据最大值不超过1000的场景)

逻辑最直观,查询性能最优:

SELECT
  num_subjects_enrolled,
  CASE
    WHEN num_subjects_enrolled <= 0 THEN 'x ≤ 0' -- 兼容小于等于0的异常值
    WHEN num_subjects_enrolled <= 30 THEN '0 <x ≤ 30'
    WHEN num_subjects_enrolled <= 200 THEN '30 <x ≤ 200'
    WHEN num_subjects_enrolled <= 500 THEN '200 <x ≤ 500'
    WHEN num_subjects_enrolled <= 1000 THEN '500 <x ≤ 1000'
    ELSE CONCAT('1000 <x ≤ ', (SELECT MAX(num_subjects_enrolled) FROM 你的表名))
  END AS bin_num_subjects_enrolled_int
FROM 你的表名;
方案2:动态计算全局最大值(完全对齐原函数逻辑)

不需要手动确认数据最大值,自动取字段全局最大值作为最后一个分箱的上界:

WITH max_val_cte AS (
  SELECT MAX(num_subjects_enrolled) AS max_enrolled FROM 你的表名
)
SELECT
  t.num_subjects_enrolled,
  CASE
    WHEN t.num_subjects_enrolled <= 0 THEN 'x ≤ 0'
    WHEN t.num_subjects_enrolled <= 30 THEN '0 <x ≤ 30'
    WHEN t.num_subjects_enrolled <= 200 THEN '30 <x ≤ 200'
    WHEN t.num_subjects_enrolled <= 500 THEN '200 <x ≤ 500'
    WHEN t.num_subjects_enrolled <= 1000 THEN '500 <x ≤ 1000'
    ELSE CONCAT('1000 <x ≤ ', mv.max_enrolled)
  END AS bin_num_subjects_enrolled_int
FROM 你的表名 t
CROSS JOIN max_val_cte mv;

验证:传入示例值583时,会命中num_subjects_enrolled <= 1000分支,返回500 <x ≤ 1000,和预期效果完全一致。
如果需要返回整数类型的分箱序号而非字符串标签,只需要把THEN后面的字符串替换为对应序号数字即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 00:18:20