給定一個表動作(開始:DATE,長度:NUMBER,類型:NUMBER),所有記錄都是唯一的,我需要在時間前選擇(例如)類型爲Y的最後一個動作的長度X:選擇最接近但不大於行
select action.length
where action.type = Y
and action.start is the biggest, but not greater than X
提出的解決方案(改善):
with actionView as (select * from action where type = Y and time <= X)
select length
from actionView
where time = (select max(time) from actionView)
但是,這仍然envolves 2點進行選擇。
我想問的是有可能對此查詢執行一些分析或分層或任何其他oracle魔法來改進它?
(也許,這樣的算法中是我需要的,但我不知道該如何表達它的SQL:
savedAction.time = MinimalTime
foreach action in actions
if action.type = y and savedAction.time < action.time <= X
savedAction = action
return savedAction;
)
你應該尋找LAG功能。您可以對數據進行排序並與以前的行進行比較。此外,您可能會感到驚訝的是,優化器對結構比您更快樂:) – Randy 2012-03-26 12:40:58