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

时间:2010-06-17 18:55:35

标签: 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

是否有重要的情况?

5 个答案:

答案 0 :(得分:59)

不,订单与GROUP BY子句无关。

MySQL和SQLite是我所知道的唯一允许您选择从组中省略的列(非标准,非便携式),但顺序与此无关。

答案 1 :(得分:22)

SQL是声明性的。

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

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

主要位置列顺序对索引很重要。 col1, col2col2, col1不同。完全没有。

答案 2 :(得分:10)

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

答案 3 :(得分:6)

因为这里没有提到。上面的答案是正确的,即“group by”子句后的列顺序不会影响查询的正确性(即总金额)。

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

Col1 Col2 Col3
1   xyz 100
2   abc 200
3   xyz 300
3   xyz 400

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

现在将group by中的列顺序更改为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

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

答案 4 :(得分:0)

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

<强>查询-1

SELECT spec_id, catid, spec_display_value, COUNT(*) AS cnt  FROM tbl_product_spec 
GROUP BY spec_id, catid, spec_display_value ;

<强>查询-2

SELECT spec_id, catid, spec_display_value, COUNT(*) AS cnt  FROM tbl_product_spec FORCE INDEX(idx_comp_spec_cnt)
GROUP BY catid, spec_id,spec_display_value;

两者都是平等的,订单不在group by子句中工作。