Mit HAVING
Klausel mit 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;
Sie sollten auch diese blog post von Aaron Betrand überprüfen zu verstehen, warum BETWEEN
mit für Termine ist eine schlechte Idee.
Sie können die Abfrage machen organisieren nur die Daten einmal erwähnen, indem Sie so etwas wie:
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);
Hinweis: Einige würden es vorziehen, eine JOIN
einen CROSS JOIN
in diesem Fall. Aus Gewohnheit habe ich immer eine Parameter CTE in eine Abfrage mit CROSS JOIN
.
Funktioniert gut, gibt mir das Ergebnis, das ich will. Wäre toll, wenn du mir erzählen könntest, wie die letzte Zeile funktioniert, habe ich das nicht verstanden. –
@TauseefHussain - Wenn sie an jedem Datum im März aktiv waren, was bedeuten würde, dass sie an 31 verschiedenen Tagen in diesem Monat aktiv waren, vermeidet das 'DATEDIFF' nur das Festschreiben dieser Nummer. –
Klar jetzt, vielen Dank. –