列的顺序是否在group by子句中重要?

Jef*_*ang 74 sql sql-server group-by

如果我有两个列,一个具有非常高的基数,另一个具有非常低的基数(唯一的值#),那么我按哪个顺序分组?

这是一个例子:

select 
     dimensionName, 
     dimensionCategory, 
     sum(someFact)
from SomeFact f
join SomeDim d on f.dimensionKey = d.dimensionKey
group by 
    d.dimensionName,  -- large number of unique values
    d.dimensionCategory -- small number of unique values
Run Code Online (Sandbox Code Playgroud)

是否有重要的情况?

OMG*_*ies 62

不,订单对GROUP BY子句无关紧要.

MySQL和SQLite是我所知道的唯一允许您选择从组中省略的列(非标准,不可移植)的数据库,但顺序在那里也无关紧要.


gbn*_*gbn 23

SQL是声明性的.

在这种情况下,您已告知优化器您希望如何对数据进行分组,并确定如何执行此操作.

它不会逐行评估(程序)并首先查看一列

主要位置列顺序对于索引很重要.col1, col2是不一样的col2, col1.完全没有.

  • 它对ORDER BY也很重要. (11认同)

nvo*_*gel 12

Microsoft SQL Server有一个传统的非标准功能,称为ROLLUP.ROLLUP是GROUP BY语法的扩展,当使用它时,GROUP BY列的顺序决定了哪些列应该在结果中分组.但是,ROLLUP已被弃用.标准SQL替代方法是使用SQL Server 2008及更高版本支持的分组集.


AaC*_*des 8

由于这里没有提到.上面的答案是正确的,即"group by"子句之后的列的顺序不会影响查询的正确性(即总和金额).

但是,要检索的行的顺序将根据"group by"子句后指定的列的顺序而有所不同.例如,考虑A具有以下行的表:

Col1 Col2 Col3
1   xyz 100
2   abc 200
3   xyz 300
3   xyz 400
Run Code Online (Sandbox Code Playgroud)

SELECT *, SUM(Col3) FROM A GROUP BY Col2, Col1将按Col2升序检索排序的行.

Col1 Col2 Col3 sum(Col3)
2   abc 200 200
1   xyz 100 100
3   xyz 300 700
Run Code Online (Sandbox Code Playgroud)

现在将group中列的顺序更改为Col1, Col2.检索到的行按顺序排序Col1.

select *, sum(Col3) from A group by Col1, Col2

Col1 Col2 Col3 sum(Col3)
1   xyz 100 100
2   abc 200 200
3   xyz 300 700
Run Code Online (Sandbox Code Playgroud)

注意:总和量(即查询的正确性)保持完全相同.

  • 但是,除非使用“ ORDER BY”,否则选择结果的行顺序始终是不确定的,不是吗?因此,即使根本不使用GROUP BY,也永远不要依赖任何特定的行顺序。 (3认同)