Tìm giá trị thường xuyên nhất trong cột SQL


122

Làm cách nào để tìm giá trị thường xuyên nhất trong một cột nhất định trong bảng SQL?

Ví dụ: đối với bảng này, nó sẽ trả về twovì nó là giá trị thường xuyên nhất:

one
two
two
three


1
Còn các mối quan hệ? Thêm một hàng 'ba' khác vào dữ liệu mẫu và chỉ định kết quả mong đợi.
jarlh

Câu trả lời:


180
SELECT       `column`,
             COUNT(`column`) AS `value_occurrence` 
    FROM     `my_table`
    GROUP BY `column`
    ORDER BY `value_occurrence` DESC
    LIMIT    1;

Thay thế columnmy_table. Tăng 1nếu bạn muốn xem các Ngiá trị phổ biến nhất của cột.


1
tôi nên làm gì nếu tôi cũng muốn chọn các trường khác từ 'my_table'? Nói cách khác, một giá trị khác;
grep

7
Điều gì sẽ xảy ra nếu nhiều hơn một giá trị xuất hiện cùng một lúc (giá trị là giá trị lớn nhất)? Trong trường hợp này, nếu ba cũng xuất hiện hai lần? LIMIT 1 sẽ chỉ hiển thị một bản ghi
mustafa1993

1
@ mustafa1993SELECT * FROM my_table GROUP BY value ORDER BY count(*) DESC;
Ahmed Syed

tại sao nó không hoạt động khi tôi thêm WHERE 'value_occurrence' = 1?
swisswiss

1
@swisswiss bạn phải sử dụng HAVINGthay vì WHEREtrong trường hợp này.
HellBaby

47

Hãy thử một cái gì đó như:

SELECT       `column`
    FROM     `your_table`
    GROUP BY `column`
    ORDER BY COUNT(*) DESC
    LIMIT    1;

6
Tôi không biết rằng bạn có thể sử dụng COUNT(*)trực tiếp trong ORDER BY. Tôi biết có một vài hạn chế liên quan đến GROUP BY/ HAVINGvà cột tổng hợp và tôi luôn cho rằng điều đó sẽ không hoạt động.
Mihai Stancu

21

Chúng ta hãy coi tên bảng là tblpersonvà tên cột là city. Tôi muốn truy xuất thành phố lặp lại nhiều nhất từ ​​cột thành phố:

 select city,count(*) as nor from tblperson
        group by city
          having count(*) =(select max(nor) from 
            (select city,count(*) as nor from tblperson group by city) tblperson)

Đây norlà một tên bí danh.


+1 để sử dụng SQL chuẩn sẽ hoạt động trong bất kỳ cơ sở dữ liệu nào (trong khi LIMIT là dành riêng cho MySQL, TOP là SQL Server cụ thể).
Dylan Smith,

7

Truy vấn dưới đây dường như hoạt động tốt đối với tôi trong cơ sở dữ liệu SQL Server:

select column, COUNT(column) AS MOST_FREQUENT
from TABLE_NAME
GROUP BY column
ORDER BY COUNT(column) DESC

Kết quả:

column          MOST_FREQUENT
item1           highest count
item2           second highest 
item3           third higest
..
..

3

Để sử dụng với SQL Server.

Vì không có hỗ trợ lệnh giới hạn trong đó.

Bạn có thể sử dụng lệnh trên cùng 1 để tìm giá trị xuất hiện lớn nhất trong cột cụ thể trong trường hợp này (giá trị)

SELECT top1 
    `value`,
    COUNT(`value`) AS `value_occurrence` 
FROM     
    `my_table`
GROUP BY 
    `value`
ORDER BY 
    `value_occurrence` DESC;

Bạn cũng cần phải di chuyển COUNT địa chỉ chức năng để ORDER BY phần để tránh bị các lỗi sau: Chỉ có một biểu hiện có thể được quy định trong danh sách lựa chọn khi subquery được không giới thiệu với EXISTS
Saba Jamalian

1

Giả sử Bảng là ' SalesLT.Customer' và Cột bạn đang cố gắng tìm ra là ' CompanyName' và AggCompanyNamelà Bí danh.

Select CompanyName, Count(CompanyName) as AggCompanyName from SalesLT.Customer
group by CompanyName
Order By Count(CompanyName) Desc;

0

Nếu bạn không thể sử dụng LIMIT hoặc LIMIT không phải là một tùy chọn cho công cụ truy vấn của bạn. Thay vào đó, bạn có thể sử dụng "ROWNUM", nhưng bạn sẽ cần một truy vấn phụ:

SELECT FIELD_1, ALIAS1
FROM(SELECT FIELD_1, COUNT(FIELD_1) ALIAS1
    FROM TABLENAME
    GROUP BY FIELD_1
    ORDER BY COUNT(FIELD_1) DESC)
WHERE ROWNUM = 1

MySQL không cóROWNUM
Barmar

Đây là hợp lệ cho oracle nhưng không mysql
Prabhu

1
@Prabhu trong MySQL, bạn sử dụng LIMIT 1thay thế; cú pháp được hiển thị trong câu trả lời được chấp nhận.
ToolmakerSteve

0

Nếu bạn có một cột ID và bạn muốn tìm danh mục lặp lại nhiều nhất từ ​​một cột khác cho mỗi ID thì bạn có thể sử dụng truy vấn bên dưới,

Bàn:

Bảng nội dung

Truy vấn:

SELECT ID, CATEGORY, COUNT(*) AS FREQ
FROM TABLE
GROUP BY 1,2
QUALIFY ROW_NUMBER() OVER(PARTITION BY ID ORDER BY FREQ DESC) = 1;

Kết quả:

Kết quả truy vấn


-1

Một cách tôi thích sử dụng là:

lựa chọn ,ĐẾM() dưới dạng VAR1 từ Table_Name

nhóm bởi

đặt hàng bởi VAR1 desc

giới hạn 1

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.