Domanda

Ho una tabella con una colonna "Data".Ogni Data può essere utilizzato più volte.Come faccio a selezionare solo le date che compaiono < k numero di volte?

È stato utile?

Soluzione

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

Speriamo che funzioni per ORACLE. HTH

Altri suggerimenti

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

Vedi anche la risposta di @ [SQLMenace]. È molto simile a questo, ma a seconda del database il suo JOIN probabilmente funzionerà più velocemente, supponendo che l'ottimizzatore non faccia la differenza.

Usa il COUNT aggregato:

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

Esempio

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] 

Per " appare x volte " interrogazioni è meglio usare la clausola HAVING. Nel tuo caso, la query può essere come:

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

oppure, in devi selezionare altre colonne tranne Data:

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

Puoi anche riscrivere IN su INNER JOIN, tuttavia questo non darà un guadagno in termini di prestazioni, poiché, in effetti, Query Optimizer lo farà per te nella maggior parte dei RDBMS. Avere un indice alla data migliorerà sicuramente le prestazioni di questa query.

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

E poi per recuperare i dati originali:

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

Supponendo che tu stia utilizzando Oracle e k = 5: -

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

Se anche la colonna della data ha il tempo compilato e si desidera ignorarla, modificare la query in modo che appaia come segue: -

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

Potrebbe non essere in grado di contare direttamente sul datefield se le vostre date sono volte.Potrebbe essere necessario convertire solo l'anno/mese/giorno formato e poi fare il conto.

Altrimenti il tuo conta sarà come di solito ci sono pochi documenti allo stesso esatto tempo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top