我們有一個將數據寫入日誌記錄表的項目。現在,在調查問題時,查詢問題行並獲取周圍的行會很有用,以便我們可以輕鬆查看導致問題的原因。日誌表有一個時間戳字段,所以我們可以按這個順序排列。在Oracle SQL中選擇周圍的行
本質上我想要像「grep -C」的SQL。
舉個例子,假設我們有一個reference_id列和一個activity_code列。我發現引用ID = 1234的問題,所以我想找到前面的N個活動。
編輯:一些示例數據
Code Reference Time
Allocate ABC1 9:00
Allocate ABC2 9:01
Problem MYREF1 9:02
Allocate ABC3 9:03
Allocate ABC4 9:03
Problem2 MYREF1 9:04
Allocate ABC5 9:09
我給「MYREF1」的東西來看待,但我想看看有什麼在同一種類的時間一直在進行。我想要一個查詢來獲取「MYREF1」引用行,以及一些其他行(可能是1或2的周圍或前面的行)。在我的例子,這將是ABC2和ABC4如果我想前行(類似於用grep -B1)
這幾乎就是它。令人沮喪的是,當我使用between子句時,我在數據表上得到了全表掃描,而如果我只是使用= following_time(或類似)子句,我會得到很好的性能。我不知道爲什麼會發生這種情況,但它使這個解決方案不起作用。 – 2009-11-09 17:10:42
您將在某處完全掃描您的log_table到您的log_table。將有一個全表掃描來獲取時間框,但你應該能夠在a.time上進行索引搜索。你看到兩個全表掃描嗎? – 2009-11-09 20:57:04
如果你買不起任何全面掃描,你需要一個索引列,你可以依賴它的「order by」(所以你已經有了'timebox')。如果真實表中的每一行都有一個連續的唯一ID,那麼您可以使用該ID,否則您可能必須回退到使用+/- x分鐘而不是+/- x行。 – 2009-11-09 21:01:16