2012-03-06 41 views
0

我的表具有列SQL timedeltas和....我認爲ineed做自我加入?

Group1 Group2 startdate enddate 

表中的一般格式是這樣的組2具有唯一的ID,並且它們在共享組1 ID批次聚集在一起,並且開始/結束日期對應於組2。有些數據可能看起來像,

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

日期不一定是幾個月的第一天,這只是簡單的方式。

我需要一個尋找特定事件的單一SELECT語句:當一個group2有一個enddate,然後'很快'之後(可以說,不到一個月),一個不同的Group2有一個開始日期與相同的Group1 。 I.E.客戶取消並重新訂閱不同的組2下的組,但是是同一組。樣本數據的'答案'將是99

如果單個select語句不可能,請讓我知道爲什麼,並建議如何使用多個。

回答

0

的介紹:大概需要的是精確的,但我有一種感覺,這是你所需要的計算,其餘爲你自己。此解決方案提供兩個推測

  1. 組1是您唯一的CustomerID(在此表中不唯一)。
  2. 您不在乎客戶取消訂單後多久才重新訂閱。

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. 添加cutsomer ID到subslelect的選擇列表
  2. 改變你的where子句,以反映其使用
  3. 將其添加到條款

   and SD.CustomerID = MT.CustomerID 

要限制的取消,從重新訂閱時間量需要一個稍微顯著編輯。如果你需要它,我會嘗試發佈它。

如果發佈的答案沒有解決問題,請發佈更多信息,包括代碼片段,表格結構以及更多關於應該如何工作的想法。

+0

是的,有一個自我加入的語法我錯了。你的答案似乎已經清除了。 – gmaximus 2012-03-06 19:22:41

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