2012-10-09 63 views
1

特定代碼的所有訂單我持有的訂單狀態變化表:TSQL獲取他們的歷史

ORDER_ID | CHANGE_DATE  | CODE_1 | CODE_2 | CODE_3 
============================================================= 
1   | 2012-09-01 12:20 | Z1  | NULL | NULL 
1   | 2012-09-01 12:21 | Z2  | S01  | NULL 
1   | 2012-09-01 12:22 | Z2  | S04  | NULL 
2   | 2012-09-01 12:22 | Z1  | S01  | NULL 
3   | 2012-09-01 12:23 | Z1  | S03  | NULL 
1   | 2012-09-01 12:24 | Z1  | S02  | NULL 
2   | 2012-09-01 12:29 | Z1  | S05  | NULL 
1   | 2012-09-01 13:29 | Z5  | T01  | X01 
2   | 2012-09-01 13:31 | Z1  | T01  | NULL 

,我需要選擇ORDER_ID爲有歷史CODE_2 IN(S01,S02每一份訂單, S03),但他們之後沒有S04和S05。

在這種特殊情況下查詢應返回1階,因爲CODE_2後沒有S04和S05,請注意,爲了在1歷史上曾有S04,但在這之後它有代碼S02。 由於代碼S03,它也應該返回訂單3。 不應退回訂單2,因爲其歷史記錄中的最後一個代碼是S05(最後一次來自S組)。

我可以做到這一點,而無需加入其他表?我只想從此表中選擇ORDER_ID。

+1

通過哪些列,你可以說,爲了1的「後」'有一個'S02' S04'。 'S04'具有較晚的日期時間值,這是唯一需要排列的明顯列。 –

+0

@Damien_The_Unbeliever - 對不起,這個小錯誤,我已經解決了這個問題。 – Misiu

+0

我已在我的答案中更新了示例數據,並驗證它現在返回訂單1和3. –

回答

1

如果CHANGE_DATE,其實,它允許行列進行排序,那麼以下就足夠了:

declare @T table (ORDER_ID int,CHANGE_DATE datetime,CODE_1 char(2),CODE_2 char(3),CODE_3 char(3)) 
insert into @T(ORDER_ID,CHANGE_DATE,CODE_1,CODE_2,CODE_3) values 
(1,'2012-09-01T12:20:00','Z1',NULL,NULL), 
(1,'2012-09-01T12:21:00','Z2','S01',NULL), 
(1,'2012-09-01T12:22:00','Z2','S04',NULL), 
(2,'2012-09-01T12:20:00','Z1','S01',NULL), 
(3,'2012-09-01T12:21:00','Z1','S03',NULL), 
(1,'2012-09-01T12:24:00','Z1','S02',NULL), 
(2,'2012-09-01T12:29:00','Z1','S05',NULL), 
(1,'2012-09-01T13:23:00','Z5','T01','X01'), 
(2,'2012-09-01T13:31:00','Z1','T01',NULL) 

select distinct ORDER_ID from @T t where CODE_2 in ('S01','S02','S03') 
and not exists(
    select * from @T t2 where 
     t.ORDER_ID = t2.ORDER_ID and 
     t2.CODE_2 in ('S04','S05') and 
     t2.CHANGE_DATE > t.CHANGE_DATE 
    ) 
+0

我會立即檢查,對於該錯誤首先感到遺憾:) – Misiu