Thứ tự của các cột có quan trọng trong một nhóm theo mệnh đề không?


85

Nếu tôi có hai cột, một cột có số lượng rất cao và một cột có số lượng rất thấp (số giá trị duy nhất), tôi nhóm theo thứ tự nào thì có vấn đề gì không?

Đây là một ví dụ:

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

Có những tình huống mà nó quan trọng không?


2
Xem bài liên quan cũng như: trật tự MYSQL5 của nhóm bằng ...
trcarden

Câu trả lời:


74

Không, thứ tự không quan trọng đối với mệnh đề GROUP BY.

MySQL và SQLite là cơ sở dữ liệu duy nhất mà tôi biết cho phép bạn chọn các cột bị bỏ qua khỏi nhóm bởi (không chuẩn, không di động) nhưng thứ tự cũng không quan trọng ở đó.


27

SQL là khai báo.

Trong trường hợp này, bạn đã nói với người tối ưu hóa cách bạn muốn dữ liệu được nhóm lại và nó sẽ tìm ra cách thực hiện.

Nó sẽ không đánh giá từng dòng một (thủ tục) và xem xét một cột trước tiên

Thứ tự cột vị trí chính quan trọng đối với chỉ mục. col1, col2không giống như col2, col1. Ở tất cả.


15
Nó cũng quan trọng đối với ORDER BY.
Vincent McNabb

12

Có một tính năng kế thừa, không chuẩn của Microsoft SQL Server được gọi là ROLLUP. ROLLUP là một phần mở rộng của cú pháp GROUP BY và khi nó được sử dụng, thứ tự của các cột GROUP BY xác định cột nào nên được nhóm lại trong kết quả. Tuy nhiên, ROLLUP không được dùng nữa. Phương pháp thay thế SQL tiêu chuẩn là sử dụng các tập hợp nhóm, được hỗ trợ bởi SQL Server 2008 và các phiên bản mới hơn.


10

Vì điều này đã không được đề cập ở đây. Các câu trả lời trên là đúng, tức là thứ tự của các cột sau mệnh đề "group by" sẽ không ảnh hưởng đến tính đúng đắn của truy vấn (tức là tổng số tiền).

Tuy nhiên, thứ tự của các hàng được truy xuất sẽ khác nhau dựa trên thứ tự của các cột được chỉ định sau mệnh đề "nhóm theo". Ví dụ, hãy xem xét Bảng Avới các hàng sau:

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

SELECT *, SUM(Col3) FROM A GROUP BY Col2, Col1sẽ truy xuất các hàng được sắp xếp Col2theo thứ tự tăng dần.

Col1 Col2 Col3 sum(Col3)
2   abc 200 200
1   xyz 100 100
3   xyz 300 700

Bây giờ thay đổi thứ tự của cột trong nhóm bằng thành Col1, Col2. Các hàng được truy xuất được sắp xếp theo thứ tự Col1.

I E 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

Lưu ý: Tổng số tiền (tức là tính đúng đắn của truy vấn) vẫn hoàn toàn giống nhau.


7
Nhưng, trừ khi sử dụng "ORDER BY", thứ tự hàng của các kết quả được chọn vẫn chưa được xác định, phải không? Vì vậy, bạn không bao giờ được dựa vào bất kỳ thứ tự cụ thể nào của các hàng, ngay cả khi hoàn toàn không sử dụng GROUP BY.
avl_sweden

Đồng ý với @avl_sweden, tôi nghĩ rằng ít nhất phản hồi phải chỉ ra rằng hành vi này là dành riêng cho việc triển khai. Không có gì đảm bảo rằng một phiên bản máy chủ SQL mới hơn (hoặc thậm chí giống nhau) sẽ không tạo ra một thứ tự khác.
NobodysNightmare

2

Nếu tôi có hai cột, một cột có số lượng rất cao và một cột có số lượng rất thấp (số giá trị duy nhất), tôi nhóm theo thứ tự nào thì có vấn đề gì không?

Truy vấn-1

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

Truy vấn-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;

Cả hai đều bằng nhau, thứ tự không hoạt động theo nhóm theo mệnh đề.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.