2017-04-15 18 views
0

tsqlを使用して、メンバーが30日間のウィンドウ内の3つの別々のバケットからのサービスを持っているかどうかを調べようとしています。バケットは必ずしも一意の値を保持するとは限りません。下の私の例では、メンバ1はウィンドウ内に3つの日付をすべて持っていませんが、メンバ2はそうしています。あなたはこれが本当であるメンバーをしたい場合は、これは一つの方法である日付がスパン内にあるかどうかを調べる

create table #dates (
    member tinyint, 
    bucket tinyint, 
    dt date 
); 

insert into #dates (member,bucket,dt) 
    values (1,1,'20170101'), 
      (1,2,'20161225'), 
      (1,2,'20170204'), 
      (1,3,'20170129'), 
      (2,1,'20170101'), 
      (2,2,'20170102'), 
      (2,3,'20161231'); 

INITIAL QUERY

select * 
from #dates d1 join 
    #dates d2 
    on d2.member=d1.member and d2.bucket=2 and 
     d2.dt between DATEADD(DAY,-30,d1.dt) and DATEADD(day,30,d1.dt) 
where d1.bucket=1 
+0

メンバー1が2つの#2バケツを持って、それは意図的なものでしょうか?また、どのように出力テーブルが表示されると思いますか?インジケータフィールドを持つメンバーごとに1つの行? – Snorex

答えて

0

に:

select distinct d.member 
from #dates d 
where exists (select 1 
       from #dates d1 
       where d1.member = d.member and d1.bucket = 1 and 
        d1.dt between DATEADD(DAY, -30, d.dt) and DATEADD(day, 30, d.dt) 
      ) and 
     exists (select 1 
       from #dates d2 
       where d2.member = d.member and d2.bucket = 2 and 
        d2.dt between DATEADD(DAY, -30, d.dt) and DATEADD(day, 30, d.dt) 
      ) and 
     exists (select 1 
       from #dates d3 
       where d3.member = d.member and d3.bucket = 3 and 
        d3.dt between DATEADD(DAY, -30, d.dt) and DATEADD(day, 30, d.dt) 
      ) ; 
関連する問題