如何用SQL按销售额四分位对百万级产品数据分组?
按总销售额区间分组的SQL解决方案
核心思路
要实现按总销售额的25%区间分组(而非按行数四分位),且适配百万级数据避免硬编码,核心是通过窗口函数计算动态累计销售额,结合总销售额的比例阈值划分分组。这种方法无需提前计算固定阈值,完全适配数据变化。
通用SQL方案
以下代码兼容PostgreSQL、MySQL 8.0+、SQL Server等主流数据库,效率适配百万行数据:
WITH total_sales AS ( -- 计算所有有效数据(排除销售额0)的总销售额 SELECT SUM(sales) AS total FROM product_sales WHERE sales > 0 ), ranked_products AS ( -- 过滤无效数据,按销售额降序排序,计算累计销售额及总销售额值 SELECT product, sales, SUM(sales) OVER (ORDER BY sales DESC) AS cumulative_sales, (SELECT total FROM total_sales) AS total_sales_val FROM product_sales WHERE sales > 0 ) SELECT product, sales, CASE -- 前25%销售额区间:当前产品之前的累计未达总销售额25% WHEN (cumulative_sales - sales) < total_sales_val * 0.25 THEN 'Q1' -- 25%-50%区间:当前产品之前的累计在25%-50%之间 WHEN (cumulative_sales - sales) < total_sales_val * 0.5 THEN 'Q2' -- 50%-75%区间:当前产品之前的累计在50%-75%之间 WHEN (cumulative_sales - sales) < total_sales_val * 0.75 THEN 'Q3' -- 剩余区间:最低25%销售额 ELSE 'Q4' END AS sales_quadrant FROM ranked_products ORDER BY sales DESC;
示例验证
示例表(product_sales)
CREATE TABLE product_sales ( product VARCHAR(10), sales INT ); INSERT INTO product_sales VALUES ('A', 100), ('B', 80), ('C', 60), ('D', 40), ('E', 20), ('F', 0), ('G', 10);
关键计算
总销售额 = 100+80+60+40+20+10 = 310
区间阈值:
- Q1阈值:310×0.25 = 77.5
- Q2阈值:310×0.5 = 155
- Q3阈值:310×0.75 = 232.5
预期输出
| product | sales | sales_quadrant |
|---|---|---|
| A | 100 | Q1 |
| B | 80 | Q2 |
| C | 60 | Q3 |
| D | 40 | Q4 |
| E | 20 | Q4 |
| G | 10 | Q4 |
内容的提问来源于stack exchange,提问作者Pratikp
相关产品推荐
相关产品推荐

