【发布时间】:2016-12-17 01:52:52
【问题描述】:
我有一个在窗口函数中没有ORDER BY 子句的查询可以正常工作:
select
"TABLE_NAME",
"DENSITY",
"NUM_DISTINCT",
ROWNUM,
median(DENSITY) OVER (PARTITION BY table_name )
from ALL_TAB_COLUMNS a
where 1=1
and owner = 'SYS'
and table_name='CARRY'
and "NUM_DISTINCT" < 1000
and DENSITY < 1
AND num_nulls = 0
但我绝对需要这个order by 子句来获取我需要的格式的数据。如果我添加order by,我会收到这个奇怪的错误消息:
ORA-30487: ORDER BY not allowed here
30487. 00000 - "ORDER BY not allowed here"
*Cause: DISTINCT functions and RATIO_TO_REPORT cannot have an ORDER BY
*Action:
Error at Line: 6 Column: 47
下面是完整的 SQL,顺序如下:
select
"TABLE_NAME",
"DENSITY",
"NUM_DISTINCT",
ROWNUM,
median(DENSITY) OVER (PARTITION BY table_name ORDER BY "DENSITY")
from ALL_TAB_COLUMNS a
where 1=1
and owner = 'DEANZA'
and table_name='CARRIER_A'
and "NUM_DISTINCT" < 1000
and DENSITY < 1
AND num_nulls = 0
【问题讨论】:
-
不,您绝对不需要在 MEDIAN(...) 函数中使用 ORDER BY。你了解 MEDIAN 是做什么的吗?您需要什么 - 对于第三行,您需要前三个密度值的中值密度,然后对于第十行 - 前十个密度值的中值等?你可能需要它来做什么?
-
将
ORDER BY DENSITY放在查询的末尾,而不是放在MEDIAN计算中。您不能在MEDIAN分析函数中使用ORDER BY- 当您在允许它的分析函数中使用ORDER BY时,它与您的结果排序无关。 -
你想完成什么?样本数据和期望的结果对沟通有很大帮助。
标签: sql oracle window-functions