Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

การนับจำนวนค่าที่แตกต่างกัน (Distinct Count) ใน MySQL

ใช้ COUNT(*) ร่วมกับ GROUP BY เพื่อนับจำนวนครั้งของแต่ละค่าที่แตกต่างกัน

สร้างตารางตัวอย่าง

mysql> create table DemoTable ( 
    Value int ); 
Query OK, 0 rows affected (0.57 sec)

เพิ่มข้อมูลตัวอย่าง

mysql> insert into DemoTable values(80); Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable values(90); Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable values(90); Query OK, 1 row affected (0.10 sec)
mysql> insert into DemoTable values(80); Query OK, 1 row affected (0.10 sec)
mysql> insert into DemoTable values(100); Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable values(90); Query OK, 1 row affected (0.12 sec)

แสดงข้อมูลทั้งหมด

mysql> select *from DemoTable;
+-------+
| Value |
+-------+
|    80 |
|    90 |
|    90 |
|    80 |
|   100 |
|    90 |
+-------+
6 rows in set (0.00 sec)

คิวรี่นับจำนวนแต่ละค่า

mysql> select Value,count(*) from DemoTable group by Value;

ผลลัพธ์:

+-------+----------+
| Value | count(*) |
+-------+----------+
|    80 |        2 |
|    90 |        3 |
|   100 |        1 |
+-------+----------+
3 rows in set (0.00 sec)

การปรับแต่งเพิ่มเติม

  • Alias: SELECT Value, COUNT(*) AS frequency ...
  • เรียงลำดับ: ORDER BY frequency DESC
  • นับค่าที่ไม่ซ้ำ (Distinct Count): SELECT COUNT(DISTINCT Value) FROM DemoTable; → ผลลัพธ์: 3
  • กรองเฉพาะที่ซ้ำ: HAVING COUNT(*) > 1

MySQL 8.0+: Window Function

SELECT DISTINCT Value, COUNT(*) OVER (PARTITION BY Value) as cnt
FROM DemoTable;

ประสิทธิภาพ

  • เพิ่ม Index: CREATE INDEX idx_value ON DemoTable(Value);
  • Covering Index: CREATE INDEX idx_value_cover ON DemoTable(Value) INCLUDE (other_cols); (MySQL 8.0.13+)

การประยุกต์: Histogram / Frequency Distribution

SELECT 
    Value,
    COUNT(*) as frequency,
    COUNT(*) * 100.0 / SUM(COUNT(*)) OVER () as percentage
FROM DemoTable
GROUP BY Value
ORDER BY Value;