SQL -Abfragehilfe: Auswählen von Zeilen, die eine bestimmte Anzahl von Male erscheinen

StackOverflow https://stackoverflow.com/questions/104971

  •  01-07-2019
  •  | 
  •  

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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top