2016-09-05 6 views
0

顧客が特定の週にアクティブかどうかを格納するSQL Server 2012テーブルがあります。私は、顧客が開始週間と終了週に沿って活動していた行の数週間を示す結果を出力したい。私は以下のコードを持っていますが、それは私が顧客が活動していた週数の合計を与えるだけです。カウントを連続して壊すことは可能ですか?どんな助けもありがとうございます。SQL Server Countシーケンシャルブレークポイント

SELECT 
    ActiveYN 
    ,MIN(StartWeek) 
    ,MAX(StartWeek) 
    ,COUNT(*) 
FROM TableA 
GROUP BY ActiveYN 

enter image description here

答えて

1

これは、ギャップ-と-島問題と呼ばれます。 1つの解決策は、行番号の違いを使用します。

select customer, activeyn, 
     min(startweek), max(startweek) 
from (select t.*, 
      (row_number() over (partition by customer order by startweek) - 
       row_number() over (partition by customer, activeyn order by startweek) 
      ) as grp 
     from tablea t 
    ) t 
group by customer, activeyn, grp; 

計算はちょっとした魔法のようです。しかし、サブクエリを実行して各row_number()計算の結果を見ると、その違いによって、探しているグループが定義されている理由がわかります。