Ayuda para consultas SQL:Seleccionar filas que aparecen una cierta cantidad de veces

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

  •  01-07-2019
  •  | 
  •  

Pregunta

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

¿Fue útil?

Solución

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

Con suerte, funciona para ORACLE.HT

Otros consejos

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

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

Utilice 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 consultas que "aparecen x veces", es mejor utilizar la cláusula HAVING.En su caso, la consulta puede ser como:

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

o, si necesita seleccionar otras columnas excepto Fecha:

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

También puede reescribir IN a INNER JOIN, sin embargo, esto no aumentará el rendimiento, 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 rendimiento 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 fecha también tiene la hora completa y desea ignorarla, modifique la consulta para que tenga el siguiente aspecto:

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 fecha si sus fechas incluyen horas.Es posible que primero necesite convertir solo al formato año/mes/día y luego contarlo.

De lo contrario, sus conteos estarán equivocados, ya que normalmente hay muy pocos registros con exactamente la misma hora.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top