Ayuda de SQL Query: selección de filas que aparecen un cierto número de veces

Tengo una tabla con una columna de "Fecha". Cada date puede aparecer varias veces. ¿Cómo selecciono solo las dates que aparecen <k número de veces?

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

Con suerte, funciona para ORACLE. HTH

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

Ver la respuesta de @ [SQLMenace] también. Es muy similar a esto, pero dependiendo de su database, su JOIN probablemente se ejecutará más rápido, suponiendo que el optimizador no hace la diferencia discutible.

Use el agregado COUNT:

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

ejemplo

 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] 

Para las consultas "aparece x veces", es mejor usar la cláusula HAVING. En su caso, la consulta puede ser como:

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

o, en la necesidad de seleccionar otras columnas excepto Fecha:

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

También puede volver a escribir IN en INNER JOIN, sin embargo, esto no proporcionará ganancia de performance, ya que, de hecho, el optimizador de consultas lo hará por usted en la mayoría de los RDBMS. Tener un índice en Fecha sin duda mejorará el performance de esta consulta.

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

Y luego para recuperar los datos originales:

 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 

Suponiendo que está utilizando Oracle, y k = 5: –

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

Si su columna de date también tiene time y desea ignorarla, modifique la consulta para que se vea de la siguiente manera:

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

Es posible que no pueda contar directamente en el campo de date si sus dates incluyen horas. Es posible que deba convertir primero al formatting año / mes / día primero y luego haga el conteo de eso.

De lo contrario, su conteo estará desactivado, ya que generalmente hay muy pocos loggings al mismo time.