Temukan nilai yang paling sering di kolom SQL


122

Bagaimana saya bisa menemukan nilai yang paling sering di kolom tertentu dalam tabel SQL?

Misalnya, untuk tabel ini harus dikembalikan twokarena ini adalah nilai yang paling sering:

one
two
two
three


1
Bagaimana dengan ikatan? Tambahkan baris 'tiga' lainnya ke data sampel, dan tentukan hasil yang diharapkan.
jarlh

Jawaban:


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

Ganti columndan my_table. Tingkatkan 1jika Anda ingin melihat Nnilai kolom yang paling umum.


1
apa yang harus saya lakukan jika saya ingin memilih bidang lain juga dari 'tabel_saya'? Dengan kata lain, nilai lain;
grep

7
bagaimana jika lebih dari satu nilai muncul dalam frekuensi yang sama (yang mana max)? Dalam hal ini, apakah tiga juga muncul dua kali? LIMIT 1 hanya akan menampilkan satu rekaman
mustafa1993

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

mengapa tidak berhasil saat saya menambahkan WHERE 'value_occurrence' = 1?
swisswiss

1
@swisswiss Anda harus menggunakan, HAVINGbukan WHEREdalam kasus ini.
HellBaby

47

Cobalah sesuatu seperti:

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

6
Saya tidak tahu apakah Anda dapat menggunakan COUNT(*)langsung di ORDER BY. Saya tahu ada beberapa batasan mengenai GROUP BY/ HAVINGdan kolom agregat dan saya selalu berasumsi bahwa itu tidak akan berhasil.
Mihai Stancu

21

Mari kita pertimbangkan nama tabel sebagai tblpersondan nama kolom sebagai city. Saya ingin mengambil kota yang paling sering diulang dari kolom kota:

 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)

Ini noradalah nama aliasnya.


1 untuk menggunakan SQL standar yang akan berfungsi di database apa pun (sedangkan LIMIT khusus MySQL, TOP khusus SQL Server).
Dylan Smith

7

Kueri di bawah ini tampaknya berfungsi dengan baik untuk saya dalam database SQL Server:

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

Hasil:

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

3

Untuk digunakan dengan SQL Server.

Karena tidak ada batasan dukungan perintah di dalamnya.

Anda dapat menggunakan perintah 1 teratas untuk menemukan nilai maksimum yang terjadi di kolom tertentu dalam kasus ini (nilai)

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

Anda juga perlu memindahkan fungsi COUNT ke bagian ORDER BY untuk menghindari kesalahan berikut: Hanya satu ekspresi yang dapat ditentukan dalam daftar pilih ketika subkueri tidak diperkenalkan dengan EXISTS
Saba Jamalian

1

Asumsi Tabel adalah " SalesLT.Customerdan Kolom yang Anda coba cari tahu adalah ' CompanyName' dan AggCompanyNamemerupakan Alias.

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

0

Jika Anda tidak dapat menggunakan LIMIT atau LIMIT bukanlah pilihan untuk alat kueri Anda. Anda dapat menggunakan "ROWNUM" sebagai gantinya, tetapi Anda akan membutuhkan sub kueri:

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 tidak memilikiROWNUM
Barmar

Ini berlaku untuk oracle tapi tidak untuk mysql
Prabhu

1
@Prabhu di MySQL, Anda menggunakan LIMIT 1; sintaks ditampilkan dalam jawaban yang diterima.
ToolmakerSteve

0

Jika Anda memiliki kolom ID dan Anda ingin menemukan kategori yang paling berulang dari kolom lain untuk setiap ID maka Anda dapat menggunakan kueri di bawah ini,

Meja:

Isi tabel

Pertanyaan:

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

Hasil:

Hasil kueri


-1

Salah satu cara yang saya suka gunakan adalah:

Pilih ,MENGHITUNG() sebagai VAR1 dari Table_Name

dikelompokkan menurut

memesan dengan VAR1 desc

batas 1

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.