2009-10-29 25 views
41

Khi tôi thực hiện "SELECT * FROM table" Tôi nhận được kết quả như dưới đây:Làm thế nào để chọn bản ghi duy nhất bởi SQL

1 item1 data1 
2 item1 data2 
3 item2 data3 
4 item3 data4 

Như bạn có thể thấy, có hồ sơ dup từ column2 (item1 được dupped). Vậy làm cách nào tôi có thể nhận được kết quả như sau:

1 item1 data1 
2 item2 data3 
3 item3 data4 

Chỉ một bản ghi được trả về từ bản sao cùng với phần còn lại của các bản ghi duy nhất.

Trả lời

58

Bạn có thể sử dụng SELECT DISTINCT hoặc GROUP BY để thực hiện việc này.

SELECT DISTINCT a, c 
FROM table_c 

hoặc

SELECT a, b 
FROM table_c 
GROUP BY a, b 

GROUP BY sẽ rất hữu ích hơn nếu bạn muốn sử dụng một số chức năng tổng hợp như COUNT() hoặc SUM()

SELECT a, b, count(*) 
FROM table_c 
GROUP BY a, b 

SELECT a, b, sum(d) 
FROM table_c 
GROUP BY a, b 
+0

Câu trả lời có thực sự sai không? DISTINCT được áp dụng cho tất cả các cột được chọn (ít nhất là trên một DB2), mà vẫn sẽ trả về các giá trị trùng lặp trong các cột riêng lẻ. – Konstantin

19

Nếu bạn chỉ cần phải loại bỏ các bản sao sau đó sử dụng DISTINCT. GROUP BY nên được sử dụng để áp dụng khai thác tổng hợp cho từng nhóm

GROUP BY v DISTINCT

6

Nó phụ thuộc vào rown bạn muốn trả lại cho từng hạng mục độc đáo. Dữ liệu của bạn dường như chỉ ra giá trị dữ liệu tối thiểu trong trường hợp này cho SQL Server.

SELECT item, min(data) 
FROM table 
GROUP BY item 
1

Tôi thấy rằng nếu tôi không thể sử dụng DISTINCT vì bất kỳ lý do nào, thì GROUP BY sẽ hoạt động.

0

Để có được tất cả các cột trong kết quả của bạn, bạn cần phải đặt một cái gì đó như:

SELECT distinct a, Table.* FROM Table 

nó sẽ đặt một như cột đầu tiên và phần còn lại sẽ được TẤT CẢ các cột theo thứ tự như định nghĩa của bạn. Đây là, cột a sẽ được lặp lại.

+1

Bạn có chắc chắn về điều này?Tôi đã thử điều này trên w3schools và nó trả về giống như SELECT *, ngoại trừ một cột đầu tiên là – Freakishly

+0

@Freakishly yes và đó là chính xác những gì nó sẽ làm trong câu trả lời của tôi:/ – htafoya

+0

Điều này sẽ không hoạt động, bạn không thể chọn * sau khi khác biệt như vậy (bạn sẽ nhận được một lỗi 1064 - Lỗi trong cú pháp SQL của bạn) –

-3

Chọn Eff_st từ ( chọn EFF_ST, ROW_NUMBER() trên (phân vùng bằng cách eff_st) XYZ - từ ABC.CODE_DIM

) trong đó XYZ = 1 trật tự bởi EFF_ST lấy chỉ có 5 dòng đầu tiên

0

chỉ sử dụng tham gia bên trong vì nhóm sẽ không hoạt động với nhiều cột không có trong hàm tổng hợp.

SELECT a.* 
FROM yourtable a 
INNER JOIN 
    (SELECT yourcolumn, 
    MIN(id) as id 
    FROM yourtable 
    GROUP BY yourcolumn 
) AS b 
    ON a.yourcolumn= b.yourcolumn 
    AND a.id = b.id; 
+0

Đó là câu trả lời cho một câu hỏi khác, có lẽ là câu hỏi được gắn thẻ với [tag: greatest-n-per-group] –

Các vấn đề liên quan