2017-02-22 23 views
0

我有一個捕獲用戶日常數據的表。 我想拉開始和結束日期爲用戶時IS_AWESOME =「Y」 我不知道如何做到這一點使用SQL用於捕獲特定條件存在的時間段的SQL代碼

USER_ID  DATE  IS_AWESOME 
123   2017-01-01  Y 
123   2017-01-02  Y 
123   2017-01-03  Y 
123   2017-01-04  N 
123   2017-01-05  Y 
123   2017-01-06  Y 
123   2017-01-07  Y 
123   2017-01-08  N 
123   2017-01-09  Y 
123   2017-01-10  Y 
123   2017-01-11  N 

如果我使用MIN(DATE)和MAX(DATE)我會沒有得到這兩個日期之間的時間間隔。

+1

你使用的是什麼rdbms?另外,你可以添加預期的結果嗎? –

回答

1

做這方面的一個典型方式使用差異row_number() S(大多數數據庫支持的ANSI標準的功能):

select user_id, min(date), max(date) 
from (select t.*, 
      row_number() over (partition by user_id order by date) as seqnum_u, 
      row_number() over (partition by user_id, is_awesome order by date) as seqnum_uia 
     from t 
    ) t 
where is_awesome = 'Y' 
group by user_id, is_awesome, (seqnum_u - seqnum_uia) ; 

解釋它是如何工作是有點棘手。如果您運行子查詢,您將看到行號的差異如何定義每組連續值。