2017-04-25 4 views
0

次は私が次のような結果にテーブル内の各エントリの入り口と出口のレコードを選択する

F_ID R_ID DATE  Col_A Col_B Col_C 
12  158 20161008 01  01  99  - Entry record 
12  158 20161022 99  01  10  - Exit Record 
12  160 20161006 01  99  01  - Entry record 
12  160 20161017 99  01  10  - Exit Record 
17  167 20161013 99  01  01  - Entry record 
17  167 20161020 02  01  10  - Exit Record 
17  174 20161010 99  01  01  - Entry record 
17  174 20161017 99  99  10  - Exit Record 

For each F_ID, R_ID: 
When Col_A or Col_B = '01' and Col_C <>'10' - **It is an entry record** 
When Col_C = '10' - **It is an exit record** 

ロジックを得るようにすることを選択したい、私は

F_ID  R_ID  DATE Col_A Col_B Col_C 
12  158  20161008 01  99  99 
12  158  20161012 01  01  99 
12  158  20161019 01  02  10 
12  158  20161022 99  01  10 
12  160  20161006 01  99  01 
12  160  20161011 99  01  99 
12  160  20161017 99  01  10 
17  167  20161013 99  01  01 
17  167  20161016 99  02  99 
17  167  20161020 02  01  10 
17  174  20161010 99  01  01 
17  174  20161012 01  02  11 
17  174  20161017 99  99  10 

を持つテーブルからのサンプルでありますここで私は以下のように労働組合を使用してと思ってい

1. Select the earliest entry record 
    **and** 
2. Select the latest exit record for each F_ID, R_ID 

...

です
Select * from tbl1 T 
where 
T.Col_C = '10' and 
T.DATE = (select max(T2.DATE) from tbl1 T2 
           where 
           T2.Col_C = '10' and 
           T2.R_ID = T.R_ID 
           T2.F_ID = T.F_ID 
     ) 

union 

Select * from tbl1 K 
where 
(K.Col_A = '01' or K.Col_B = '01') and 
K.Col_C <> '10' and 
K.DATE = (select min(K2.DATE) from tbl1 K2 where 
         (K2.Col_A = '01' or K2.Col_B = '01') and 
         K2.Col_C <> '10' and 
         K2.R_ID = K.R_ID 
         K2.F_ID = K.F_ID 
     ) 

しかし、私が自己結合を使って同じテーブルで行ったように、ユニオンを使用すると、私にガベージデータが返されます。

+0

を> ' 01''と '' Col_B <> '01''''と '' Col_C <>' 10''''のどちらかです。これはエントリーでも出口レコードでもないので、これは何ですか?このようなレコードをスキップするだけですか? –

+0

"ガベージデータ"とはどういう意味ですか?私の意見では、クエリは大丈夫です。 'ORDER BY'節はもちろん役立ちます。そして、あなたが排除しなければならない重複がないので、 'UNION'はあまり意味がありません。代わりに 'UNION ALL'を使用してください。 –

+0

Col_A <> '01'とCol_B <> '01'とCol_C <> '10' - この条件はまだエントリレコードとして数えることができます – Hemansh

答えて

3

私が正しく理解していれば、あなたはこの必要があります。

SELECT * FROM (
    SELECT T1.*, ROW_NUMBER() OVER(PARTITION BY F_ID , R_ID order by DATE) rn, 'Entry record' as rec FROM (
     SELECT * FROM your_table WHERE (Col_A = '01' or Col_B = '01') and Col_C <> '10' 
    ) T1 
    union all 
    SELECT T2.*, ROW_NUMBER() OVER(PARTITION BY F_ID , R_ID order by DATE DESC) rn , 'Exit record' as rec FROM (
     SELECT * FROM your_table WHERE Col_C = '10' 
    ) T2 
) t3 
where rn = 1 

編集

`Col_A <何が起こる

より簡易版(@ThorstenKettnerのおかげで)

SELECT * FROM (
    SELECT your_table.*, ROW_NUMBER() OVER(PARTITION BY F_ID, R_ID order by DATE) as rn, 'Entry record' as rec FROM your_table WHERE (Col_A = '01' or Col_B = '01') and Col_C <> '10' 
    union all 
    SELECT your_table.*, ROW_NUMBER() OVER(PARTITION BY F_ID, R_ID order by DATE DESC) as rn, 'Exit record' as rec FROM your_table WHERE Col_C = '10' 
) t3 
where rn = 1 
ORDER BY F_ID, R_ID, DATE 
+1

これは、 'ROW_NUMBER'と' WHERE'を同じこれをネストする代わりにそして、 'ORDER BY'節がデータを望みの順序で取得します。 –

+0

@ThorstenKettner - 両方のWHERE句が同時にどのように実装されるのでしょうか?理解できません。 –

+3

'FROM your_table WHERE(Col_A = '01'またはCol_B = '01')およびCol_C <>のように、rnとして 'T1、* ROW_NUMBER()OVER(F_ID、 '10'' –

関連する問題