0

タイトルがばかげているようで、情報が不足している場合は、次の例で状況を説明しようとしています。

次の表を検討してください-

ID     Event     Time
---------------------
1      EventA     ta
1      EventB     tx
2      EventB     ty
1      EventC     tb
2      EventC     to

EventBのインスタンスの後に(時間に基づいて)EventCが存在するようにIDを選択したいと思います。

私は次のクエリを考えることができます:

 select ID from TabET where
    ((select TIME from TabET where Event = EventC order by TIME desc fetch first row only)
    >
     (select TIME from TabET where Event = EventB order by TIME desc fetch first row only))

テーブルは実際には非常に大きなテーブルであり、このクエリは条件を満たすための大きなクエリ内のサブクエリであるため、より良いアプローチと代替手段を探しています。

編集

IDは一意ではありません。問題は、(TIMEに基づいて)EventBの後にEventCがあるIDを識別することです。

4

1 に答える 1

1

自己結合を使用できます。

select distinct t1.ID 
   from table t1
   join table t2 on 
      t1.ID = t2.ID and
      t1.Event = 'EventB' and
      t2.Event = 'EventC' and
      t2.Time > t1.Time

別のアプローチ:

with latest_times as (
   select id, max(time) as time from table 
       where Event='EventC'
       group by id
)
select t1.ID from table t1
    join latest_times on 
        t1.id = latest_times.id and
        t1.Event = 'EventB' and
        latest_times.time > t1.time 
于 2013-03-21T10:40:04.867 に答える