Ajuda à consulta SQL: Selecionando linhas que aparecem um certo número de vezes
Pergunta
Eu tenho uma tabela com uma coluna "data". Cada data pode aparecer várias vezes. Como seleciono apenas as datas que aparecem <K número de vezes?
Solução
select dates
from table t
group by dates having count(dates) < k ;
Felizmente, funciona para o Oracle. Hth
Outras dicas
SELECT * FROM [MyTable] WHERE [Date] IN
(
SELECT [Date]
FROM [MyTable]
GROUP By [Date]
HAVING COUNT(*) < @Max
)
Veja a resposta do @[SQLMENACE] também. É muito parecido com isso, mas, dependendo do seu banco de dados, sua junção provavelmente será mais rápida, assumindo que o otimizador não faça a diferença discutível.
Use o agregado da contagem:
SELECT Date
FROM SomeTable
GROUP BY Date
HAVING COUNT(*) < @k
exemplo
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 "Aparece x Times", é melhor usar a cláusula. No seu caso, a consulta pode ser como:
SELECT Date FROM table GROUP BY Date HAVING COUNT(*)<k
Ou, em você precisa selecionar outras colunas, exceto a data:
SELECT * FROM Table WHERE Date IN (
SELECT Date FROM table GROUP BY Date HAVING COUNT(*)<k)
Você também pode reescrever o Inner Junção, no entanto, isso não dará ganho de desempenho, pois, de fato, o Otimizador de consultas fará isso por você na maioria dos RDBMs. Ter índice na data certamente melhorará o desempenho para esta consulta.
SELECT date, COUNT(date)
FROM table
GROUP BY date
HAVING COUNT(date) < k
E então para recuperar os dados originais:
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
Supondo que você esteja usando o Oracle e K = 5:-
select date_col,count(*)
from your_table
group by date_col
having count(*) < 5;
Se a sua coluna de data também tiver tempo preenchido e você deseja ignorá-la, modifique a consulta para que pareça a seguir:-
select trunc(date_col) as date_col,count(*)
from your_table
group by trunc(date_col)
having count(*) < 5;
Você pode não ser capaz de contar diretamente no DateField se suas datas incluirem horários. Pode ser necessário converter para apenas o formato do ano/mês/dia primeiro e depois fazer a contagem com isso.
Caso contrário, sua contagem estará desativada, pois geralmente existem muito poucos registros com o mesmo tempo.