ค้นหาค่าที่พบบ่อยที่สุดในคอลัมน์ SQL


122

ฉันจะค้นหาค่าที่พบบ่อยที่สุดในคอลัมน์ที่ระบุในตาราง SQL ได้อย่างไร

ตัวอย่างเช่นสำหรับตารางนี้ควรส่งคืนtwoเนื่องจากเป็นค่าที่พบบ่อยที่สุด:

one
two
two
three


1
แล้วความสัมพันธ์ล่ะ? เพิ่มแถว 'สาม' อีกแถวในข้อมูลตัวอย่างและระบุผลลัพธ์ที่คาดหวัง
jarlh

คำตอบ:


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

แทนที่columnและmy_table. เพิ่มขึ้น1หากคุณต้องการดูNค่าที่พบบ่อยที่สุดของคอลัมน์


1
ฉันควรทำอย่างไรหากต้องการเลือกช่องอื่นจาก "my_table" กล่าวอีกนัยหนึ่งคือค่าอื่น
grep

7
จะเกิดอะไรขึ้นถ้ามากกว่าหนึ่งค่าปรากฏขึ้นไม่เท่ากัน (ซึ่งเป็นค่าสูงสุด)? ในกรณีนี้ถ้ามีสามตัวปรากฏขึ้นสองครั้ง? LIMIT 1 จะแสดงเพียงรายการเดียว
mustafa1993

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

ทำไมถึงไม่ได้ผลเมื่อฉันเพิ่มWHERE 'value_occurrence' = 1?
swisswiss

1
@swisswiss คุณต้องใช้HAVINGแทนWHEREในกรณีนี้
HellBaby

47

ลองสิ่งที่ชอบ:

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

6
ฉันไม่รู้ว่าคุณสามารถใช้COUNT(*)โดยตรงในไฟล์ORDER BY. ฉันรู้ว่ามีข้อ จำกัด บางประการเกี่ยวกับGROUP BY/ HAVINGและคอลัมน์รวมและฉันคิดเสมอว่าจะใช้ไม่ได้
Mihai Stancu

21

ขอให้เราพิจารณาเป็นชื่อตารางและชื่อคอลัมน์เป็นtblperson cityฉันต้องการดึงเมืองที่ซ้ำกันมากที่สุดจากคอลัมน์เมือง:

 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)

นี่norคือนามแฝง


+1 สำหรับการใช้ SQL มาตรฐานที่จะทำงานในฐานข้อมูลใด ๆ (ในขณะที่ LIMIT เป็นเฉพาะ MySQL ส่วน TOP คือ SQL Server เฉพาะ)
Dylan Smith

7

แบบสอบถามด้านล่างดูเหมือนจะทำงานได้ดีสำหรับฉันในฐานข้อมูล SQL Server:

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

ผลลัพธ์:

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

3

สำหรับใช้กับ SQL Server

เนื่องจากไม่มีการสนับสนุนคำสั่ง จำกัด ในนั้น

คุณสามารถใช้คำสั่ง 1 อันดับแรกเพื่อค้นหาค่าที่เกิดขึ้นสูงสุดในคอลัมน์เฉพาะในกรณีนี้ (ค่า)

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

คุณต้องย้ายฟังก์ชัน COUNT ไปยังส่วน ORDER BY เพื่อหลีกเลี่ยงการรับข้อผิดพลาดต่อไปนี้: สามารถระบุนิพจน์ได้เพียงรายการเดียวในรายการที่เลือกเมื่อไม่มีการใช้แบบสอบถามย่อยกับ EXISTS
Saba Jamalian

1

สมมติว่า Table คือ ' SalesLT.Customer' และคอลัมน์ที่คุณพยายามหาคือ ' CompanyName' และAggCompanyNameเป็นนามแฝง

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

0

หากคุณไม่สามารถใช้ LIMIT หรือ LIMIT ไม่ใช่ตัวเลือกสำหรับเครื่องมือสืบค้นข้อมูลของคุณ คุณสามารถใช้ "ROWNUM" แทนได้ แต่คุณจะต้องมีคำค้นหาย่อย:

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 ไม่มีROWNUM
Barmar

ใช้ได้กับ oracle แต่ไม่ใช่ mysql
Prabhu

1
@Prabhu ใน MySQL คุณใช้LIMIT 1แทน; ไวยากรณ์จะแสดงในคำตอบที่ยอมรับ
ToolmakerSteve

0

หากคุณมีคอลัมน์ ID และต้องการค้นหาหมวดหมู่ที่ซ้ำกันมากที่สุดจากคอลัมน์อื่นสำหรับแต่ละ ID คุณสามารถใช้แบบสอบถามด้านล่าง

ตาราง:

เนื้อหาตาราง

ค้นหา:

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

ผลลัพธ์:

ผลการค้นหา


-1

วิธีหนึ่งที่ฉันชอบใช้คือ:

เลือก ,นับ() เป็น VAR1 จาก Table_Name

จัดกลุ่มตาม

สั่งซื้อโดย VAR1 desc

ขีด จำกัด 1

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.