SQL Query Help: Sélection de lignes qui apparaissent un certain nombre de fois

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

  •  01-07-2019
  •  | 
  •  

Question

J'ai une table avec un & "Date &"; colonne. Chaque date peut apparaître plusieurs fois. Comment sélectionner uniquement les dates qui apparaissent & Lt; k nombre de fois?

Était-ce utile?

La solution

select dates 
  from table t 
 group by dates having count(dates) < k ;

Espérons que cela fonctionne pour ORACLE. HTH

Autres conseils

SELECT * FROM [MyTable] WHERE [Date] IN
(
    SELECT [Date] 
    FROM [MyTable] 
    GROUP By [Date] 
    HAVING COUNT(*) < @Max
)

Voir la réponse de @ [SQLMenace] également. Cela ressemble beaucoup à cela, mais en fonction de votre base de données, son processus JOIN s’exécutera probablement plus rapidement, en supposant que l’optimiseur ne fasse pas la différence.

Utilisez l'agrégat COUNT:

SELECT Date
FROM SomeTable
GROUP BY Date
HAVING COUNT(*) < @k

exemple

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] 

Pour " apparaît x fois " Il est préférable d’utiliser la clause HAVING. Dans votre cas, la requête peut ressembler à:

SELECT Date FROM table GROUP BY Date HAVING COUNT(*)<k

ou, dans vous devez sélectionner d'autres colonnes sauf Date:

SELECT * FROM Table WHERE Date IN (
SELECT Date FROM table GROUP BY Date HAVING COUNT(*)<k)

Vous pouvez également réécrire IN vers INNER JOIN, mais cela ne vous apportera aucun gain de performances, car en fait, l’optimiseur de requêtes le fera pour vous dans la plupart des SGBDR. Avoir un index sur Date améliorera certainement les performances de cette requête.

SELECT date, COUNT(date)
FROM table
GROUP BY date
HAVING COUNT(date) < k

Et ensuite, pour récupérer les données d'origine:

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

En supposant que vous utilisez Oracle et k = 5: -

select date_col,count(*)
from your_table
group by date_col
having count(*) < 5;

Si le temps de votre colonne de date est également rempli et que vous souhaitez l'ignorer, modifiez la requête afin qu'elle se présente comme suit: -

select trunc(date_col) as date_col,count(*)
from your_table
group by trunc(date_col)
having count(*) < 5;

Il est possible que vous ne puissiez pas compter directement sur le champ de date si vos dates incluent des heures. Vous devrez peut-être d'abord convertir uniquement le format année / mois / jour, puis compter à votre place.

Sinon, vos comptes seront faussés car il y a généralement très peu d'enregistrements avec exactement le même temps.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top