Uso HAVING
clausola con COUNT(DISTINCT)
:
SELECT Campaign_id
FROM Impressions
WHERE Date between '2015-03-01' and '2015-03-31'
GROUP BY Campaign_id
HAVING COUNT(DISTINCT Date) = 31;
Si dovrebbe anche su questo blog post da Aaron Betrand per capire il motivo per cui utilizzando BETWEEN
per le date è una cattiva idea.
È possibile rendere organizzare la query per citare solo le date, una volta facendo qualcosa di simile:
WITH params as (
SELECT CAST('2015-03-01' as DATE) as date1, CAST('2015-03-31' as DATE) date2
)
SELECT i.Campaign_id
FROM params CROSS JOIN
Impressions i
WHERE i.Date >= params.Date1 and i.Date < DATEADD(day, 1, params.Date2)
GROUP BY i.Campaign_id, params.date1, params.date2
HAVING COUNT(DISTINCT i.Date) = 1 + DATEDIFF(day, params.date1, params.date2);
Nota: alcuni preferirebbero un JOIN
ad un CROSS JOIN
in questo caso. Per abitudine, inserisco sempre un parametro CTE in una query usando CROSS JOIN
.
fonte
2015-06-21 15:07:33
Funziona alla grande, mi dà il risultato che voglio. Sarebbe bello se tu potessi dirmi come funziona l'ultima linea, non l'ho capito. –
@TauseefHussain - Se fossero attive tutte le date di marzo che significherebbero essere attive per 31 giorni distinti in quel mese, il 'DATEDIFF' evita solo di codificare questo numero. –
Cancella ora, grazie mille. –