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)
是否有重要的情况?
gbn*_*gbn 23
SQL是声明性的.
在这种情况下,您已告知优化器您希望如何对数据进行分组,并确定如何执行此操作.
它不会逐行评估(程序)并首先查看一列
主要位置列顺序对于索引很重要.col1, col2是不一样的col2, col1.完全没有.
nvo*_*gel 12
Microsoft SQL Server有一个传统的非标准功能,称为ROLLUP.ROLLUP是GROUP BY语法的扩展,当使用它时,GROUP BY列的顺序决定了哪些列应该在结果中分组.但是,ROLLUP已被弃用.标准SQL替代方法是使用SQL Server 2008及更高版本支持的分组集.
由于这里没有提到.上面的答案是正确的,即"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)
注意:总和量(即查询的正确性)保持完全相同.