2017-02-06 6 views
1

count of in-between rows from same column valuesを取得する方法を以前に尋ねましたが、これはhereで表示されます。提供されるソリューションは完璧に機能しますが、現在は追加の列が必要になりますall値はSTARTENDの間です。同じ列名から中間セル値を取得

サンプル表

/-----------------------------------------\ 
| ID ---------- Event -------- UserID ----| 
| 1 ----------- START -------- 000001 ----| 
| 2 ----------- START -------- 000002 ----| 
| 3 ----------- END -------- 000001 ----| 
| 4 ----------- PL -------- 000002 ----| 
| 5 ----------- END -------- 000002 ----| 
\-----------------------------------------/ 

所望の出力ここ

+0

あなたは_more_ 1以上のレコードが二つのマーカーの間に存在している場合には、 'rowbetweenvalue'のために表示するために何を計画していますか? –

+0

私はこのPL、RC、ZZのように表示することができれば良いだろう。一般的に、2つのマーカーの間には1つのレコードしかありませんが、まさに2つ以上のマーカーを取得する可能性があります。 – aioracle

答えて

2

ドゥドゥMarkovitzが提供するソリューションに基づいて、それを行うための1つの方法は、これです:

サンプルテーブルを作成し、移入(私たちのセーブくださいあなたの将来の質問では、このステップ)

DECLARE @T AS TABLE 
(
    id int, 
    event varchar(5), 
    UserId char(6) 
) 

INSERT INTO @T VALUES 
(1, 'START', '000001'), 
(2, 'START', '000002'), 
(3, 'END', '000001'), 
(4, 'PL', '000002'), 
(5, 'ZZ', '000002'), 
(6, 'END', '000002') 

カプセル化ドゥドゥさん

SELECT UserId, 
     From_Id, 
     To_Id, 
     Events As eventCount, 
     STUFF(
     (
      SELECT ',' + event 
      FROM @T 
      WHERE UserId = cte.UserId 
      AND Id > from_ID 
      AND Id < to_ID 
      FOR XML PATH('') 
     ) 
     , 1, 1, '') As events 
FROM CTE  
ORDER BY UserID ,from_id 
:CTE

;WITH cte AS 
(
    select  UserID 
       ,min(ID)  as from_ID 
       ,max(ID)  as to_ID 
       ,count(*) as events 

    from  (select  UserID,ID,Event 
          , count(case when Event in ('START','END') then 1 end) over 
           (
            partition by UserID 
            order by  Id 
            rows   unbounded preceding 
           ) 
          - case when Event = 'END' then 1 else 0 end as group_seq 

       from  @T 
       ) t 

    group by UserID 
       ,group_seq 

    having  min(case when Event = 'START' then 1 end) = 1 
) 

問合せに答えます3210の

結果:

UserId From_Id To_Id eventCount events 
000001 1  3  2   NULL 
000002 2  6  4   PL,ZZ 
0
/---------------------------------------------------------\ 
| UserID ----------- Row Count ----------- rowbetweenvalue| 
| 000001 ----------- 2   ----------- NULL   | 
| 000002 ----------- 3   ----------- PL    | 
\---------------------------------------------------------/ 

サンプルである:

WITH sample_table(ID,Event,UserID)AS(
    SELECT 1,'START','000001' UNION ALL 
    SELECT 2,'START','000002' UNION ALL 
    SELECT 3,'END','000001' UNION ALL 
    SELECT 4,'PL','000002' UNION ALL 
    SELECT 5,'RC','000002' UNION ALL 
    SELECT 6,'END','000002' 
) 
SELECT t1.UserID,2+ISNULL(LEN(r.v)-LEN(REPLACE(r.v,',','')),0) AS [Row Count],STUFF(r.v,1,1,'') AS rowbetweenvalue 
FROM sample_table AS t1 
CROSS APPLY(SELECT top 1 ID AS ENDID FROM sample_table AS tt WHERE tt.UserID=t1.UserID AND tt.ID>t1.ID AND tt.Event='END' ORDER BY ID) c 
CROSS APPLY(SELECT ','+st.Event FROM sample_table AS st WHERE st.UserID=t1.UserID AND st.ID>t1.ID AND st.ID<c.ENDID FOR XML PATH('')) AS r(v) 
WHERE t1.Event='START' 
 
UserID Row Count   rowbetweenvalue 
------ -------------------- ------------------------ 
000001 2     NULL 
000002 4     PL,RC 
関連する問題