Using the HAVING with 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;
You should also look at this blog post from Aaron Betrand to understand why using BETWEEN for dates is a bad idea.
You can make a request to specify only dates once, doing something like:
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);
Note. Some people prefer JOIN to CROSS JOIN in this case. Out of habit, I always set CTE parameters in a query using CROSS JOIN .
source share