Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Nhóm Oracle chỉ theo MỘT cột

Bình luận dài ở đây;

Vâng, bạn không thể làm điều đó. Hãy suy nghĩ về nó ... Nếu bạn có một bảng như vậy:

Col1 Col2 Col3
A    A    1
B    A    2
C    A    3

Và bạn chỉ đang nhóm theo Col2 , sẽ nhóm xuống một hàng ... điều gì sẽ xảy ra với Col1Col3 ? Cả hai đều có 3 giá trị hàng riêng biệt. DBMS của bạn phải hiển thị những giá trị đó như thế nào?

Col1 Col2 Col3
A?   A    1?
B?        2?
C?        3?

Đây là lý do tại sao bạn phải nhóm theo tất cả các cột, hoặc tổng hợp hoặc nối chúng. (SUM() , MAX() , MIN() , v.v ..)

Hãy cho chúng tôi biết bạn muốn kết quả trông như thế nào và tôi chắc chắn rằng chúng tôi có thể giúp bạn.

Chỉnh sửa - Trả lời:

Trước hết, cảm ơn vì đã cập nhật câu hỏi của bạn. Truy vấn của bạn không có id nhưng kết quả mong đợi của bạn thì có, vì vậy tôi sẽ trả lời riêng cho từng kết quả.

Không có id

Bạn vẫn sẽ cần phải nhóm theo tất cả các cột để đạt được những gì bạn muốn. Hãy xem qua nó.

Nếu bạn chạy truy vấn của mình mà không có bất kỳ nhóm nào bằng cách:

select col1, col2, col3 from table where col3='200'

Bạn sẽ nhận lại được điều này:

+----------+-------------+-------+
| col1     | col2        | col3  |
+----------+-------------+-------+
| 1        | some text 1 | 200   |
| 2        | some text 1 | 200   |
| 5        | some text 1 | 200   |
| 1        | some text 1 | 200   |
+----------+-------------+-------+

Vì vậy, bây giờ bạn chỉ muốn xem col1 = 1 hàng một lần. Nhưng để làm như vậy, bạn cần cuộn tất cả của các cột lên trên, vì vậy DBMS của bạn biết phải làm gì với từng cột trong số chúng. Nếu bạn cố gắng chỉ nhóm theo col1 , DBMS của bạn sẽ gặp lỗi vì bạn không cho nó biết phải làm gì với dữ liệu bổ sung trong col2col3 :

select col1, col2, col3 from table where col3='200' group by col1 --Errors

+----------+-------------+-------+
| col1     | col2        | col3  |
+----------+-------------+-------+
| 1        | some text 1 | 200   |
| 2        | some text 1 | 200   |
| 5        | some text 1 | 200   |
| ?        | some text 1?| 200?  |
+----------+-------------+-------+

Nếu bạn nhóm theo cả 3, DBMS của bạn biết nhóm toàn bộ các hàng lại với nhau (đó là những gì bạn muốn) và sẽ chỉ hiển thị các hàng trùng lặp một lần:

select col1, col2, col3 from table where col3='200' group by col1, col2, col3

+----------+-------------+-------+
| col1     | col2        | col3  |
+----------+-------------+-------+
| 1        | some text 1 | 200   |
| 2        | some text 1 | 200   | --Desired results
| 5        | some text 1 | 200   |
+----------+-------------+-------+

Với id

Nếu bạn muốn xem id , bạn sẽ phải cho DBMS của mình biết id nào để hiển thị. Ngay cả khi chúng tôi nhóm theo tất cả các cột, bạn sẽ không nhận được kết quả mong muốn của mình, bởi vì id cột sẽ làm cho mỗi hàng khác biệt (Chúng sẽ không còn nhóm lại với nhau):

select id, col1, col2, col3 from table where col3='200' group by id, col1, col2, col3

+--------+----------+-------------+-------+
| id     | col1     | col2        | col3  |
+--------+----------+-------------+-------+
| 2      | 1        | some text 1 | 200   | --id = 2
| 3      | 2        | some text 1 | 200   |
| 7      | 5        | some text 1 | 200   |
| 8      | 1        | some text 1 | 200   | --id = 8
+--------+----------+-------------+-------+

Vì vậy, để nhóm các hàng này, chúng ta cần nói rõ ràng phải làm gì với id S. Dựa trên kết quả mong muốn, bạn muốn chọn id = 2 , đó là tối thiểu id , vì vậy hãy sử dụng MIN() :

select MIN(id), col1, col2, col3 from table where col3='200' group by col1, col2, col3
--Note, MIN() is an aggregate function, so id need not be in the group by

Điều này trả về kết quả mong muốn của bạn (với id ):

+--------+----------+-------------+-------+
| id     | col1     | col2        | col3  |
+--------+----------+-------------+-------+
| 2      | 1        | some text 1 | 200   |
| 3      | 2        | some text 1 | 200   |
| 7      | 5        | some text 1 | 200   |
+--------+----------+-------------+-------+

Suy nghĩ cuối cùng

Đây là hai hàng sự cố của bạn:

+--------+----------+-------------+-------+
| id     | col1     | col2        | col3  |
+--------+----------+-------------+-------+
| 2      | 1        | some text 1 | 200   |
| 8      | 1        | some text 1 | 200   |
+--------+----------+-------------+-------+

Bất cứ khi nào bạn đạt được những điều này, chỉ cần nghĩ về những gì bạn muốn mỗi cột làm, mỗi lần một cột. Bạn sẽ cần xử lý tất cả bất kỳ lúc nào bạn thực hiện nhóm hoặc tổng hợp.

  • id , bạn chỉ muốn xem id = 2 , là MIN()
  • co1 , bạn chỉ muốn thấy các giá trị riêng biệt, vì vậy GROUP BY
  • col2 , bạn chỉ muốn thấy các giá trị riêng biệt, vì vậy GROUP BY
  • col3 , bạn chỉ muốn thấy các giá trị riêng biệt, vì vậy GROUP BY


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Điều kiện tham gia Oracle với Top 1

  2. Oracle SQL- Gắn cờ các bản ghi dựa trên ngày tháng so với lịch sử của bản ghi

  3. Cách nhanh nhất để thực hiện so sánh trường trong cùng một bảng với lượng lớn dữ liệu trong oracle

  4. UID - Trả lại ID của Phiên hiện tại trong Oracle

  5. Di chuyển dữ liệu từ oracle sang HDFS, xử lý và chuyển sang Teradata từ HDFS