SQL -Abfragehilfe: Auswählen von Zeilen, die eine bestimmte Anzahl von Male erscheinen
Frage
Ich habe eine Tabelle mit einer Spalte "Datum". Jedes Datum kann mehrmals angezeigt werden. Wie wähle ich nur die Daten aus, die <k zeit oft erscheinen?
Lösung
select dates
from table t
group by dates having count(dates) < k ;
Hoffentlich funktioniert es für Oracle. HTH
Andere Tipps
SELECT * FROM [MyTable] WHERE [Date] IN
(
SELECT [Date]
FROM [MyTable]
GROUP By [Date]
HAVING COUNT(*) < @Max
)
Siehe auch die Antwort von @[SQLMENACE]. Es ist sehr ähnlich, aber abhängig von Ihrer Datenbank wird sein Join wahrscheinlich schneller laufen, vorausgesetzt, der Optimierer macht den Unterschied nicht zu streiten.
Verwenden Sie das Grafen -Aggregat:
SELECT Date
FROM SomeTable
GROUP BY Date
HAVING COUNT(*) < @k
Beispiel
DECLARE @Max int
SELECT @Max = 5
SELECT t1.*
FROM [MyTable] t1
JOIN(
SELECT [Date]
FROM [MyTable]
GROUP By [Date]
HAVING COUNT(*) < @Max
) t2 on t1.[Date] = t2.[Date]
Für Abfragen "erscheint x -mal" ist es am besten, Klausel zu verwenden. In Ihrem Fall kann die Abfrage wie:
SELECT Date FROM table GROUP BY Date HAVING COUNT(*)<k
Oder müssen Sie andere Spalten außer Datum auswählen:
SELECT * FROM Table WHERE Date IN (
SELECT Date FROM table GROUP BY Date HAVING COUNT(*)<k)
Sie können das In -In -Inner -Join auch umschreiben. Dies gibt jedoch keinen Leistungsgewinn, da der Query -Optimierer dies in den meisten RDBMs für Sie tut. Wenn Sie den Index am Datum haben, wird die Leistung für diese Abfrage sicherlich verbessert.
SELECT date, COUNT(date)
FROM table
GROUP BY date
HAVING COUNT(date) < k
Und dann um die Originaldaten zurückzubekommen:
SELECT table.*
FROM table
INNER JOIN (
SELECT date, COUNT(date)
FROM table
GROUP BY date
HAVING COUNT(date) < k) dates ON table.date = dates.date
Angenommen, Sie verwenden Oracle und k = 5:-
select date_col,count(*)
from your_table
group by date_col
having count(*) < 5;
Wenn Ihre Datumsspalte ebenfalls ausgefüllt ist und Sie sie ignorieren möchten, ändern Sie die Abfrage, damit sie wie folgt aussieht:-
select trunc(date_col) as date_col,count(*)
from your_table
group by trunc(date_col)
having count(*) < 5;
Möglicherweise können Sie nicht direkt auf das Datum der Datum zählen, wenn Ihre Daten Zeiten enthalten. Möglicherweise müssen Sie zuerst in das Jahr/Monat/Tag -Format konvertieren und dann darauf zählen.
Andernfalls sind Ihre Zählungen ausgeschaltet, da es normalerweise nur sehr wenige Datensätze mit der gleichen Zeit gibt.