如果我有两个列,一个具有非常高的基数,另一个具有非常低的基数(唯一的值#),那么按照我分组的顺序是否重要?
以下是一个例子:
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
是否有重要的情况?
答案 0 :(得分:59)
不,订单与GROUP BY子句无关。
MySQL和SQLite是我所知道的唯一允许您选择从组中省略的列(非标准,非便携式),但顺序与此无关。
答案 1 :(得分:22)
SQL是声明性的。
在这种情况下,您已告知优化器您希望如何对数据进行分组,并确定如何执行此操作。
它不会逐行评估(程序性)并首先查看一列
主要位置列顺序对索引很重要。 col1, col2
与col2, 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子句中工作。