1

注文のステータス変更を保持するテーブルがあります。

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

履歴に CODE_2 IN (S01,S02,S03) があるが、その後に S04 と S05 がないすべての注文に対して ORDER_ID を選択する必要があります。

この特定のケースでは、クエリは注文 1 を返す必要があります。これは、CODE_2 の後に S04 と S05 がないためです。注文 1 の履歴には S04 があり、その後にコード S02 があったことに注意してください。コード S03 のため、注文 3 も返す必要があります。オーダー 2 は、履歴の最後のコードが S05 (S グループの最後のコード) であるため、返されるべきではありません。

他のテーブルに参加せずにこれを行うことはできますか? このテーブルから ORDER_ID のみを選択したいと思います。

4

1 に答える 1

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
    )
于 2012-10-09T13:51:19.427 に答える