求PostgreSQL中按3分位数统计数据行数的查询语句
PostgreSQL 查询:统计3分位数区间的行数
需求说明
根据给定的水果价格数据,统计三个3分位数区间内的记录行数:
percentile_3_1:price < 10 的行数percentile_3_2:处于中间3分位数区间的行数percentile_3_3:处于最高3分位数区间的行数
输入数据
假设数据存储在名为 fruits 的表中,结构如下:
| id | name | price |
|---|---|---|
| 1 | apple | 12 |
| 2 | banana | 6 |
| 3 | orange | 18 |
| 4 | pineapple | 26 |
| 5 | lemon | 30 |
查询语句
方式一:按指定区间边界(price < 10)
用条件聚合直接统计各区间行数:
SELECT COUNT(CASE WHEN price < 10 THEN 1 END) AS percentile_3_1, COUNT(CASE WHEN price >= 10 AND price < 26 THEN 1 END) AS percentile_3_2, COUNT(CASE WHEN price >= 26 THEN 1 END) AS percentile_3_3 FROM fruits;
方式二:自动计算分位数边界(通用方案)
通过 PERCENTILE_DISC 函数自动计算分位点,避免硬编码数值,适配任意数据分布:
WITH quantiles AS ( -- 计算3分位数的两个分界点 SELECT PERCENTILE_DISC(1.0/3) WITHIN GROUP (ORDER BY price) AS q1, PERCENTILE_DISC(2.0/3) WITHIN GROUP (ORDER BY price) AS q2 FROM fruits ) SELECT COUNT(CASE WHEN price < q1 THEN 1 END) AS percentile_3_1, COUNT(CASE WHEN price >= q1 AND price < q2 THEN 1 END) AS percentile_3_2, COUNT(CASE WHEN price >= q2 THEN 1 END) AS percentile_3_3 FROM fruits, quantiles;
输出结果
两种方式都会得到符合期望的结果:
| percentile_3_1 | percentile_3_2 | percentile_3_3 |
|---|---|---|
| 1 | 2 | 2 |
补充说明
PERCENTILE_DISC返回数据集中实际存在的离散分位数,若需要连续分位数,可替换为PERCENTILE_CONT函数。- 条件聚合中,不满足条件的
CASE语句返回NULL,COUNT函数会自动忽略NULL值,从而得到各区间的有效行数。
内容的提问来源于stack exchange,提问作者Quentin Gaultier
相关产品推荐
相关产品推荐

