SQL Query Help: Sélection de lignes qui apparaissent un certain nombre de fois
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?
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.