不使用窗口函数计算不同产品对应销量的中位数(仅奇数行场景)
奇数行场景下分组计算销量中位数SQL方案(无窗口函数实现)
实现思路
- 先通过自连接为每个产品下的销量生成排序序号:对同一产品的每一条销量记录,统计小于等于当前销量的记录总数,即为当前记录的排序位次
- 单独计算每个产品对应的中位数位次,针对奇数行场景公式为
(COUNT(quantity) + 1) / 2,和你提到的ROUND(COUNT(quantity)/2 + 1)计算结果完全一致 - 最后匹配每个产品下排序位次等于中位数位次的销量值,即为该产品的中位数
实现代码
假设你的原始表名为 sales,对应SQL如下:
SELECT t1.product, t1.quantity AS median FROM sales t1 WHERE ( SELECT COUNT(*) FROM sales t2 WHERE t2.product = t1.product AND t2.quantity <= t1.quantity ) = ( SELECT (COUNT(*) + 1) / 2 FROM sales t3 WHERE t3.product = t1.product ) GROUP BY t1.product, t1.quantity ORDER BY t1.product;
结果验证
针对你提供的测试数据,上述SQL执行后输出结果和预期完全匹配:
| Product | Median |
|---|---|
| A | 2 |
| B | 6 |
| C | 13 |
| D | 5 |
补充说明
如果你的原始数据存在同一个产品下相同销量的重复记录,只需要在计数逻辑里补充唯一值判定条件即可,当前方案针对无重复销量的奇数行场景可直接复用。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

