ลำดับของคอลัมน์มีความสำคัญในกลุ่มตามข้อหรือไม่?


85

ถ้าฉันมีสองคอลัมน์คอลัมน์หนึ่งมีคาร์ดินาลลิตี้สูงมากและอีกคอลัมน์หนึ่งมีคาร์ดินาลลิตี้ต่ำมาก (# ของค่าที่ไม่ซ้ำกัน) จะมีความสำคัญในลำดับใดที่ฉันจัดกลุ่มตาม?

นี่คือตัวอย่าง:

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

มีสถานการณ์ที่สำคัญหรือไม่?


2
ดูโพสต์ที่เกี่ยวข้องเช่นกัน: MYSQL5 ลำดับของกลุ่มโดย ...
— trcarden

คำตอบ:


74

ไม่คำสั่งไม่สำคัญสำหรับคำสั่ง GROUP BY

MySQL และ SQLite เป็นฐานข้อมูลเดียวที่ฉันทราบว่าอนุญาตให้คุณเลือกคอลัมน์ที่ละเว้นจากกลุ่มโดย (ไม่ใช่แบบมาตรฐานไม่ใช่แบบพกพา) แต่คำสั่งไม่สำคัญเช่นกัน


27

SQL เป็นประกาศ

ในกรณีนี้คุณได้บอกผู้เพิ่มประสิทธิภาพว่าคุณต้องการให้จัดกลุ่มข้อมูลอย่างไรและมีวิธีดำเนินการอย่างไร

จะไม่ประเมินทีละบรรทัด (ขั้นตอน) และดูที่คอลัมน์เดียวก่อน

ลำดับคอลัมน์สถานที่หลักมีความสำคัญสำหรับดัชนี col1, col2ไม่เหมือนกับcol2, col1. เลย.


15
นอกจากนี้ยังมีความสำคัญสำหรับ ORDER BY
— Vincent McNabb

12

มีคุณลักษณะที่ไม่เป็นมาตรฐานเดิมของ Microsoft SQL Server ที่เรียกว่า ROLLUP ROLLUP เป็นส่วนขยายของไวยากรณ์ GROUP BY และเมื่อใช้ลำดับของคอลัมน์ GROUP BY จะกำหนดคอลัมน์ที่ควรจัดกลุ่มในผลลัพธ์ ROLLUP เลิกใช้งานแล้ว ทางเลือกของ SQL มาตรฐานคือการใช้ชุดการจัดกลุ่มซึ่งรองรับโดย SQL Server 2008 และเวอร์ชันที่ใหม่กว่า


10

เนื่องจากยังไม่ได้กล่าวถึงที่นี่ คำตอบข้างต้นถูกต้องกล่าวคือลำดับของคอลัมน์หลังส่วนคำสั่ง "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

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

หมายเหตุ: จำนวนผลรวม (เช่นความถูกต้องของแบบสอบถาม) ยังคงเท่าเดิมทุกประการ


7
แต่ถ้าไม่มีการใช้ "ORDER BY" ลำดับแถวของผลลัพธ์ที่เลือกก็ยังไม่ได้กำหนดใช่หรือไม่ ดังนั้นคุณไม่ควรพึ่งพาลำดับแถวใด ๆ แม้ว่าจะไม่ได้ใช้ GROUP BY เลยก็ตาม
— avl_sweden

เห็นด้วยกับ @avl_sweden ฉันคิดว่าอย่างน้อยที่สุดคำตอบควรบ่งชี้ว่าพฤติกรรมนี้เป็นพฤติกรรมเฉพาะการนำไปใช้งาน ไม่มีการรับประกันว่าเซิร์ฟเวอร์ SQL เวอร์ชันใหม่กว่า (หรือรุ่นเดียวกัน) จะไม่สร้างลำดับที่แตกต่างกัน
— NobodysNightmare

2

ถ้าฉันมีสองคอลัมน์คอลัมน์หนึ่งมีคาร์ดินาลลิตี้สูงมากและอีกคอลัมน์หนึ่งมีคาร์ดินาลลิตี้ต่ำมาก (# ของค่าที่ไม่ซ้ำกัน) จะมีความสำคัญในลำดับใดที่ฉันจัดกลุ่มตาม?

แบบสอบถาม -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;

ทั้งสองเท่ากันคำสั่งไม่ทำงานในกลุ่มตามข้อ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.