2012-03-06 6 views
0

私のテーブルは、テーブルの一般的なフォーマットは、グループ2には固有のIDを持っている、と彼らはグループ1 IDを共有してバッチで一緒に凝集され、開始/終了日は、グループ2に対応する列SQLのtimedeltasと....私は自己参加するineedと思いますか?

Group1 Group2 startdate enddate 

を持っています。一部のデータは、

Group1 Group2 startdate enddate 
    1  51  20120101 
    1  23  20120201 
    2  54  20120101 20120201 
    2  99  20120215 
    3  21  20120201 20120301 

のように見える場合があります。日付は必ずしも月の最初ではありません。

特定のイベントを検索する単一の文が必要です。グループ2に終了日があり、その後すぐに(1か月未満)、別のグループ2には同じグループ1の開始日があります。 I.顧客は異なるグループ2ではなく同じグループ1の下でキャンセルして再購読します。サンプルデータの「回答」は99

です。単一のselect文が不可能な場合は、私に理由を教えて、複数でそれを行う方法を提案してください。

答えて

0

もっとINFOMATIONは、おそらく正確には必要ですが、私は、これはあなた自身のために残りの部分を把握するために必要なものである感じを持っています。この解決策は、2つの前提を作ります。

  1. Group1は、この表では一意ではありません。
  2. Custが再登録されてから再登録するまでの時間は気にしません。

select  SD.Group1, 
      MT.Group2, 
      SD.startdate 
from  MyTable MT 
      join (
       select  Group1, 
          max(startdate) as startdate 
       from  MyTable 
       where  Group1 = 2 
       group by Group1 
      ) SD on SD.Group1 = MT.Group1 
       and SD.startdate = MT.startdate 

あなたが別の顧客IDを使用したい場合は、

  1. subslelectの選択リスト
  2. にcutsomer IDを追加句は、その使用
  3. を反映するためにあなたの場所を変更
  4. これをjoin on節に追加します。

   and SD.CustomerID = MT.CustomerID 

再サブスクライブを中止からの時間の量を制限するには、もう少し意味のある編集が必要です。あなたがそれを必要とするなら私はそれを投稿しようとします。

投稿された回答で解決できない場合は、コードクリップ、テーブル構造などの情報を投稿して、どのように動作するかを考えてください。

+0

はい、自己結合の構文がありました。私は間違っていました。あなたの答えはそれをクリアしたようです。 – gmaximus

0
SELECT * 
    FROM MyTable t 
WHERE enddate IS NULL 
    AND EXISTS(
        SELECT 1 
         FROM MyTable 
        WHERE Group2 <> t.Group2 
         AND Group1 = t.Group1 
         AND enddate BETWEEN t.startdate AND DATEADD(month, -1, t.startdate) 
         AND enddate IS NOT NULL 
       ) 
0
declare @table2 table(startdate datetime, enddate datetime, group1 int, group2 int) 

insert into @table2 
select '20120101', null, 1, 51 
UNION 
select '20120101', null, 1, 23 
UNION 
select '20120101', '20120201', 2, 54 
UNION 
select '20120215', null, 2, 99 
UNION 
select '20120101', null, 3, 21 

select a.group2 from @table2 a inner join @table2 b on a.group1 = b.group1 and b.enddate > DATEADD(mm, -1, a.startdate) and a.enddate is null