SELECT DISTINCT Campaign_id
FROM Impressions
WHERE Date BETWEEN '2015-03-01' AND '2015-03-31' ;
上述查詢給我的結果對於一直在積極在2015年3月1日和2015年3月31日之間的任何日期Campaign_id
的。SQL:Where子句
我希望結果集包含campaign_id
,如果在2015-03-01和2015-03-31之間的所有日期都處於活動狀態。
我怎麼會去嗎?
SELECT DISTINCT Campaign_id
FROM Impressions
WHERE Date BETWEEN '2015-03-01' AND '2015-03-31' ;
上述查詢給我的結果對於一直在積極在2015年3月1日和2015年3月31日之間的任何日期Campaign_id
的。SQL:Where子句
我希望結果集包含campaign_id
,如果在2015-03-01和2015-03-31之間的所有日期都處於活動狀態。
我怎麼會去嗎?
假設DATE
是DATE
數據類型並且沒有時間分量。
DECLARE @Start DATE = '2015-03-01',
@End DATE = '2015-03-31'
SELECT Campaign_id
FROM Impressions
WHERE Date BETWEEN @Start AND @End
GROUP BY Campaign_id
HAVING COUNT(DISTINCT Date) = 1 + DATEDIFF(DAY, @Start, @End);
或者一個版本不變量
SELECT Campaign_id
FROM Impressions
CROSS APPLY (VALUES ({ d '2015-03-01' },
{ d '2015-03-31' })) V([Start], [End])
WHERE [Date] BETWEEN [Start] AND [End]
GROUP BY Campaign_id, [Start], [End]
HAVING COUNT(DISTINCT Date) = 1 + DATEDIFF(DAY, [Start], [End]);
使用HAVING
子句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;
你也應該由Aaron伯特蘭審查這一blog post理解爲什麼使用BETWEEN
日期是一個壞主意。
您可以安排查詢,只能通過做類似提及的日期一次:
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);
注:有些人會喜歡JOIN
到CROSS JOIN
在這種情況下。按照習慣,我總是在使用CROSS JOIN
的查詢中添加參數CTE。
使用日期之間沒有什麼錯,使用日期時間只存在的問題 –
完美的作品,謝謝。 –
偉大的作品,給我我想要的結果。如果你能告訴我最後一行是如何工作的,那就太棒了,但是沒有完全理解。 –
@TauseefHussain - 如果他們在3月的每個日期都活躍,這意味着他們在那個月的31個不同的日子裏活躍,那麼'DATEDIFF'只是避免硬編碼這個數字。 –
現在清除,非常感謝。 –