0

service_t というテーブルがあり、unix タイムスタンプが入力された effective_dt 列があります。max effective_dt を持つすべての行を検索する必要がありますが、effective_dt は特定の値より小さくなければなりません。次のSQLがありますが、効率的ではないと思います:

Select *
  from service_t t1
 where t1.effective_dt <= :given_value
   and t1.effective_dt = (select max(effective_dt)
                            from service_t t2
                           where t2.effective_dt <= :given_value
                             and t1.id = t2.id)

これは効率的ですか、それとも他の良い方法ですか?ありがとう!

4

1 に答える 1

2

分析関数を使用すると、おそらくより効率的です。

Select * from (
  select t1.*, 
       dense_rank() over (partition by id order by effective_dt desc) rn
  from service_t t1
 where t1.effective_dt <= :given_value)
where rn = 1
于 2012-10-05T14:21:59.033 に答える