GROUP BY与ORDER BY结合使用

fre*_*low 9 sql oracle group-by sql-order-by

GROUP BY子句对行进行分组,但不一定按任何特定顺序对结果进行排序.要更改顺序,请使用GROUP BY子句后面的ORDER BY子句.ORDER BY子句中使用的列必须出现在SELECT列表中,这与正常使用ORDER BY不同.[Oracle示例,第四版,第274页]

这是为什么?为什么使用GROUP BY会影响SELECT子句中的必需列?

此外,在我不使用GROUP BY的情况下:为什么我要ORDER BY某些列,但是然后只选择列的一个子集?

Dav*_*sta 6

引用中的粗体文本不正确(在许多常见用例中可能过于简单化,但作为要求并不严格.)例如,这个语句执行得很好,虽然AVG(val)不在选择列表中:

WITH DATA AS (SELECT mod(LEVEL,3) grp, LEVEL val FROM dual CONNECT BY LEVEL < 100)
SELECT grp,MIN(val),MAX(val)
FROM DATA
GROUP BY grp
ORDER BY AVG(val)
Run Code Online (Sandbox Code Playgroud)

ORDER BY子句中的表达式必须能够在GROUP BY的上下文中进行计算.例如,ORDER BY val在上面的示例中val不起作用,因为表达式对于分组生成的每一行都没有明确的值.

至于你的第二个问题,你可能关心排序,但不关心排序表达的价值.从选择列表中排除不需要的表达式会减少必须实际从服务器发送到客户端的数据量.


hol*_*hol 5

实际上,正如戴夫·科斯塔的例子所示,这种说法并不完全正确.

Oracle文档说可以使用表达式,但表达式必须基于选择列表中的列.

expr - expr根据expr的值对行进行排序.表达式基于选择列表中的列或FROM子句中的表,视图或物化视图中的列.来源:Oracle®数据库SQL语言参考11g第2版(11.2)E26088-01 2011年9月.第19-33页

从相同的工作页面19-13和19-33(PDF中的页面1355和1365)

在此输入图像描述

在此输入图像描述

http://docs.oracle.com/cd/E11882_01/server.112/e26088/statements_10002.htm#SQLRF01702

http://docs.oracle.com/cd/E11882_01/server.112/e26088/statements_10002.htm#i2171079