SQLite
 sql >> Datenbank >  >> RDS >> SQLite

Duplikate aus Count()-Ergebnissen in SQLite entfernen

Bei Verwendung von count() Funktion in SQLite finden Sie sich möglicherweise in einer Situation wieder, in der Sie nur eindeutige Werte zählen möchten. Das heißt, Sie möchten nicht, dass doppelte Werte mehrmals gezählt werden.

Mit anderen Worten, wenn die Spalte mehrmals denselben Wert hat, sollte sie diesen Wert nur einmal zählen.

Standardmäßig count() schließt alle doppelten Werte in seine Berechnung ein. Wenn beispielsweise der Wert „Katze“ dreimal vorkommt, count() zählt das als 3.

Wenn Sie jedoch möchten, dass nur eindeutige Werte gezählt werden, dann count() würde es als 1 zählen.

Glücklicherweise gibt es eine einfache Möglichkeit, dies zu tun. Sie müssen lediglich den DISTINCT hinzufügen Stichwort zu Ihrem count() Funktion. So:

count(DISTINCT x)

Wobei x ist der Spaltenname, dessen Inhalt Sie zählen (oder die ganze Zeile, wenn Sie den Sternchen-Platzhalter verwenden).

Beispiel

Nehmen Sie die folgende Tabelle:

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     

Beachten Sie, dass die Zeilen 2 bis 4 alle denselben Preis haben (10,0).

Wenn ich ein normales count() mache auf den Preis Spalte, werden alle sechs Zeilen gezählt.

SELECT count(Price) FROM Products;

Ergebnis:

6

Wenn ich jedoch den DISTINCT hinzufüge Schlüsselwort, werden diese drei Zeilen als eine gezählt.

SELECT count(DISTINCT Price) FROM Products;

Ergebnis:

4

Unterscheidbare Zeilen zählen

Der count() Die Funktion akzeptiert das Sternchen als Platzhalter (* ), was bedeutet, dass alle Zeilen gezählt werden.

Allerdings erhalten Sie wahrscheinlich eine Fehlermeldung, wenn Sie versuchen, DISTINCT zu verwenden bei Verwendung des Sternchen-Platzhalters.

Hier ist eine Tabelle mit doppelten Zeilen.

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

Theoretisch sollte ich in der Lage sein, DISTINCT zu verwenden um die „deduplizierten“ Zeilen in dieser Tabelle zu zählen. Das scheint jedoch nicht möglich zu sein.

SELECT count(DISTINCT *)
FROM States;

Ergebnis:

Error: near "*": syntax error

Stattdessen muss ich einen Spaltennamen angeben, wenn ich DISTINCT verwende Schlüsselwort.

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

Ergebnis:

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

Eine andere Möglichkeit wäre, so etwas zu tun:

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

Ergebnis:

6

Dies sollte jedoch kein wirkliches Problem darstellen, da es im Allgemeinen kein gutes Datenbankdesign ist, doppelte Zeilen wie diese zuzulassen.