【发布时间】:2014-05-14 15:53:06
【问题描述】:
是否有一种直接的方法来计算已按指标聚合的数据的中位数?换句话说,我有一个表,其中测量值是分组依据的一部分,并且记录了每个测量值的计数。
CREATE TABLE MEASUREMENTS AS
SELECT 'RED' COLOR, 4 MEASUREMENT, 5 MEASURE_COUNT FROM DUAL UNION ALL
SELECT 'RED' COLOR, 5 MEASUREMENT, 3 MEASURE_COUNT FROM DUAL UNION ALL
SELECT 'RED' COLOR, 6 MEASUREMENT, 1 MEASURE_COUNT FROM DUAL UNION ALL
SELECT 'BLUE' COLOR, 5 MEASUREMENT, 4 MEASURE_COUNT FROM DUAL UNION ALL
SELECT 'BLUE' COLOR, 6 MEASUREMENT, 5 MEASURE_COUNT FROM DUAL ;
╔═══════╦═════════════╦═══════════════╗
║ COLOR ║ MEASUREMENT ║ MEASURE_COUNT ║
╠═══════╬═════════════╬═══════════════╣
║ RED ║ 4 ║ 5 ║
║ RED ║ 5 ║ 3 ║
║ RED ║ 6 ║ 1 ║
║ BLUE ║ 5 ║ 4 ║
║ BLUE ║ 6 ║ 5 ║
╚═══════╩═════════════╩═══════════════╝
“自然”的解决方案是将测量计数分解为具有值的单个行,然后使用 Oracle 提供的 MEDIAN 进行分组 - 数学如下所示:
RED=>(4,4,4,4,4,5,5,5,6), median = 4
BLUE=>(5,5,5,5,6,6,6,6,6), median = 6
但是 (1) 我正在处理数以百万计的行,这些行会爆炸成数以千万计的单独测量值,并且 (2) 感觉就像我在“撤消和重做”数学上昂贵的中位数工作。
因为我想对此有一个视图定义,并且将分析嵌入视图往往会削弱执行计划,所以我想避免这样的事情:
SELECT COLOR,
MIN(MEASUREMENT) MEDIAN_MEASUREMENT
FROM
(
SELECT COLOR,
MEASUREMENT,
SUM(MEASURE_COUNT) OVER (PARTITION BY COLOR ORDER BY MEASURE_COUNT) /
SUM(MEASURE_COUNT) OVER (PARTITION BY COLOR) PCT
FROM MEASUREMENTS
)
WHERE PCT >=.5
GROUP BY COLOR
如果数学上可能的话,我更希望有一些可以用直接 GROUP BY 完成的事情(为 AVG 提供的示例):
SELECT COLOR,
SUM(MEASUREMENT) / SUM(MEASURE_COUNT) AVG_MEASUREMENT
-- MEDIAN LOGIC (???) HERE
FROM MEASUREMENTS
GROUP BY COLOR
【问题讨论】:
-
我更新了我的答案。我可以用子选择替换分析函数,但我不确定这是否值得。
标签: sql oracle statistics