SQLite
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> SQLite

Loại bỏ các kết quả trùng lặp khỏi Count () trong SQLite

Khi sử dụng count() trong SQLite, bạn có thể gặp phải trường hợp bạn chỉ muốn đếm các giá trị riêng biệt. Có nghĩa là, bạn không muốn các giá trị trùng lặp được tính nhiều lần.

Nói cách khác, nếu cột có cùng một giá trị nhiều lần, thì cột đó chỉ nên đếm giá trị đó một lần.

Theo mặc định, count() sẽ bao gồm tất cả các giá trị trùng lặp trong tính toán của nó. Ví dụ:nếu giá trị “Cat” xuất hiện 3 lần, thì count() sẽ tính là 3.

Tuy nhiên, nếu bạn chỉ muốn các giá trị riêng biệt được đếm, thì count() sẽ tính nó là 1.

May mắn thay, có một cách dễ dàng để làm điều này. Tất cả những gì bạn cần làm là thêm DISTINCT từ khóa đến count() của bạn hàm số. Như thế này:

count(DISTINCT x)

Ở đâu x là tên cột chứa nội dung bạn đang đếm (hoặc toàn bộ hàng nếu bạn đang sử dụng ký tự đại diện dấu hoa thị).

Ví dụ

Lấy bảng sau:

ProductId   ProductName    Price     
----------  -------------  ----------
1           Widget Holder  139.5     
2           Blue Widget    10.0      
3           Red Widget     10.0      
4           Green Widget   10.0      
5           Widget Stick   89.75     
6           Foo Cap        11.99     

Lưu ý rằng tất cả các hàng từ 2 đến 4 đều có cùng một mức giá (10,0).

Nếu tôi thực hiện count() bình thường về Giá , nó sẽ đếm tất cả sáu hàng.

SELECT count(Price) FROM Products;

Kết quả:

6

Tuy nhiên, nếu tôi thêm DISTINCT từ khóa, nó sẽ tính ba hàng đó là một.

SELECT count(DISTINCT Price) FROM Products;

Kết quả:

4

Đếm các hàng riêng biệt

count() hàm chấp nhận ký tự đại diện dấu hoa thị (* ), có nghĩa là nó sẽ đếm tất cả các hàng.

Tuy nhiên, có thể bạn sẽ gặp lỗi nếu cố sử dụng DISTINCT khi sử dụng ký tự đại diện dấu hoa thị.

Đây là một bảng có các hàng trùng lặp.

Postal      State             
----------  ------------------
NSW         New South Wales   
NSW         New South Wales   
QLD         Queensland        
TAS         Tasmania          
SA          South Australia   
WA          Western Australia 
VIC         Victoria          

Về lý thuyết, tôi có thể sử dụng DISTINCT để đếm các hàng "đã loại bỏ lỗi" trong bảng này. Tuy nhiên, điều đó dường như không thể thực hiện được.

SELECT count(DISTINCT *)
FROM States;

Kết quả:

Error: near "*": syntax error

Thay vào đó, tôi cần chỉ định tên cột khi sử dụng DISTINCT từ khóa.

SELECT 
  count(State),
  count(DISTINCT State)
FROM States;

Kết quả:

count(State)  count(DISTINCT State)
------------  ---------------------
7             6                    

Một cách khác để làm điều đó sẽ là làm một cái gì đó như sau:

SELECT count(*) FROM (SELECT DISTINCT * FROM States);

Kết quả:

6

Tuy nhiên, điều này không thực sự là một vấn đề, vì thiết kế cơ sở dữ liệu thường không tốt để cho phép các hàng trùng lặp như thế này.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tích hợp SQLCipher với greenDAO

  2. Khóa chính xử lý vương quốc Android trong đối tượng quan hệ

  3. SQLite - Chọn dữ liệu

  4. SQLiteOpenHelper:phương thức onCreate () không được gọi trên thiết bị vật lý

  5. sqlite:cách thêm tổng thời gian hh:mm:ss trong đó kiểu dữ liệu cột là DATETIME?