代码之家  ›  专栏  ›  技术社区  ›  Jeff Meatball Yang

GROUPBY子句中列的顺序重要吗?

  •  64
  • Jeff Meatball Yang  · 技术社区  · 14 年前

    如果我有两列,一列基数很高,一列基数很低(值的唯一性),按哪个顺序分组有关系吗?

    举个例子:

    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 回复  |  直到 14 年前
        1
  •  77
  •   user2864740 Heinzi    8 年前

    不,顺序对GROUPBY子句不重要。

    MySQL和SQLite是我所知道的唯一允许您选择从group by中省略的列的数据库(非标准的,不可移植的),但是顺序也不重要。

        2
  •  27
  •   gbn    14 年前

    在本例中,您已经告诉优化程序您希望如何对数据进行分组,并且它会解决如何进行分组的问题。

    它不会逐行求值(程序性的)并首先查看一列

    列顺序问题的主要位置是索引。 col1, col2 不等于 col2, col1 . 完全。

        3
  •  12
  •   nvogel    14 年前

        4
  •  10
  •   AaCodes    8 年前

    因为这里没有提到这一点。以上答案是正确的,即“group by”子句后面的列顺序不会影响 正确性

    但是,要检索的行的顺序将根据在“groupby”子句之后指定的列的顺序而有所不同。例如,考虑表 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
    

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

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

        5
  •  2
  •   Eric Aya    7 年前

    如果我有两列,一列基数很高,一列基数很低(值的唯一性),按哪个顺序分组有关系吗?

    查询-1

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

    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;
    

    两者都是相等的,顺序在GROUPBY子句中不起作用。