首先,我在 DB2 for i5/OS V5R4 上运行。我有 ROW_NUMBER()、RANK() 和公用表表达式。我没有TOP n PERCENT 或 LIMIT OFFSET。
我正在使用的实际数据集很难解释,所以假设我有一个天气历史表,其中的列是(city, temperature, timestamp)
. 我想比较每组的中位数和平均值(city)
。
这是我发现获得整个表聚合的中位数的最干净的方法。我在这里从 IBM 红皮书改编了它:
WITH base_t AS
( SELECT temp, row_number() over (order by temperature) AS rownum FROM t ),
count_t AS
( SELECT COUNT(temperature) + 1 AS base_count FROM base_t ),
median_t AS
( SELECT temperature FROM base_t, count_t
WHERE rownum in (FLOOR(base_count/2e0), CEILING(base_count/2e0)) )
SELECT DECIMAL(AVG(temperature),10,2) AS median FROM median_t
这对于恢复单行很有效,但对于分组来说似乎分崩离析。从概念上讲,这就是我想要的:
SELECT city, AVG(temperature), MEDIAN(temperature) FROM ...
城市| 平均温度 | 中值温度
==================================================== =
'明尼阿波利斯' | 60 | 64
'密尔沃基' | 65 | 66
'马斯基根' | 70 | 61
可能会有一个让我看起来很愚蠢的答案,但我有一个心理障碍,这不是我现在要做的第一件事。似乎有可能,但我不能使用非常复杂的东西,因为它是一个大表,我希望能够自定义正在聚合的列。