2016-07-26 11 views
0

日付列[LogDate](ログされているとき)、ステータス列[Status](たとえば0と1)、およびユーザーID [ユーザーID]のレコードセット(例:TableA)同じユーザーに対して、異なる日付で同じステータスのレコードが少なくなることがあります。SQL Server:グループ化された結果の計算

最初の日付からstatus = 0にログされてから最初のステータスが各ユーザーの= 1だったので(その時間の合計を得ることができるように)、時間差(すべてのユーザー)にしたい。私はそれができると確信しています、私はちょうど行き止まりの通りに入っています。私は任意のアイデアに感謝しますので、私は...データの

例に移動することができます。

UserId LogDate  Status 
-------------------------- 
1  01/01/2016 1  
1  02/01/2016 1  
1  07/01/2016 1  
1  10/01/2016 0  
1  11/01/2016 1 
1  12/01/2016 0 
2  01/01/2016 1  
2  02/01/2016 1  
2  07/01/2016 0  
2  10/01/2016 0  
2  11/01/2016 1 
2  12/01/2016 0 

を私はユーザーID = 2のためのユーザーID = 1と6日間、9日間の結果を得ることを期待しますそれらの合計を得ることは簡単なようです。

ユーザID 1の日数の計算:ステータス= 1の最初のレコードは10/01/2016にあり、ステータス= 0の最初のレコードは01/01/2016です。

select userId, 
     max(case when seqnum = 1 and status = 0 then logDate end) as logDate_0, 
     max(case when seqnum = 1 and status = 1 then logDate end) as logDate_1 
from (select t.*, 
      row_number() over (partition by userId, status order by logDate) as seqnum 
     from t 
    ) t 
group by userId; 
+2

あなたの質問に答えて、サンプルデータと望ましい結果を提供してください。 –

+0

どのように9日間カウントしますか?見せてください。 – NEER

答えて

1

ここでは、各ステータスの最初の日付を取得する一つの方法があるとし、 :

UserId DayOfLogDate 
1  9 
2  6 
1

この

DECLARE @Tbl TABLE (UserId INT, LogDate DATETIME, Status INT) 

INSERT INTO @Tbl 
select 1 ,  '2016.01.01', 1 union all 
select 1 ,  '2016.01.02', 1 union all 
select 1 ,  '2016.01.07', 1 union all 
select 1 ,  '2016.01.10', 0 union all 
select 1 ,  '2016.01.11', 1 union all 
select 1 ,  '2016.01.12', 0 union all 
select 2 ,  '2016.01.01', 1 union all 
select 2 ,  '2016.01.02', 1 union all 
select 2 ,  '2016.01.07', 0 union all 
select 2 ,  '2016.01.10', 0 union all 
select 2 ,  '2016.01.11', 1 union all 
select 2 ,  '2016.01.12', 0  


SELECT 
    M.UserId, 
    DATEDIFF(dd, MIN(M.StartLogDate) ,MIN(M.EndLogDate)) AS DayOfLogDate 
FROM 
(
    SELECT 
     C.UserId,    
     CASE WHEN C.Status = 1 THEN C.LogDate ELSE (SELECT NULL) END AS StartLogDate,   
     CASE WHEN C.Status = 0 THEN C.LogDate ELSE (SELECT NULL) END AS EndLogDate   
    FROM 
     @Tbl C 
) M 
GROUP BY 
    M.UserId 

出力を試してみてください。これらの日付間の日数の差は9

おかげ

関連する問題