Ajuda à consulta SQL: Selecionando linhas que aparecem um certo número de vezes

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

  •  01-07-2019
  •  | 
  •  

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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top