2015-04-25 31 views
0

爲了提高性能,我需要一個sql來實現以下要求。oracle sql爲了獲得最小時間戳結果的次數大於

如果有一個表,下面幾列:

id timestamp value 

我怎樣才能得到最小的時間戳(例如:T1)的結果> 100000當計數?

那麼下面的SQL結果 - COUNT(*)會> 100000

select count(*) from table where timestamp < :t1 

回答

1

我你的問題的認識:在表格中找到最早有至少100,000行的時間戳記。

可能有很多方法可以做到這一點;主要困難在於試圖提出一個有效的。

我認爲分析函數法最可能奏效。最明顯的選擇是使用COUNT:

select min(timestamp) from (
    select timestamp, count(*) over (order by timestamp rows between unbounded preceding and 1 preceding) earlier_rows 
    from table 
) 
where earlier_rows >= 100000 

,但我懷疑使用RANK或類似的東西會更快:

select min(timestamp) from (
    select timestamp, rank() over (order by timestamp) time_rank 
    from table 
) 
where time_rank > 100000 

我不知道把我的頭頂部,但這些可能如果存在重複的時間戳,則結果略有不同。

+0

是的,這就是我想要的,謝謝 – fudy

+0

但查詢需要我6秒 – fudy

0

這會給你最小和最大值和計數

select 
    count(t.*), 
    min(t.timestamp), 
    max(t.timestamp) 
from table t 
where (select count(*) from table t where t.timestamp < :t1) > 10000 
+0

不回答問題,條件> 100000缺失 – fudy

+0

「WHERE」子句中不允許使用聚合函數。 –

+0

是試圖快速並將查詢的第一部分複製到哪裏。這將運行查詢兩次,但它會獲取where語句的所有記錄,並再次查詢實際查詢,認爲最好是像下面那樣運行查詢,並在查詢中運行查詢結果時檢查結果檢查其超過10000 選擇 計數, 分鐘(t.timestamp), MAX(t.timestamp) 從表T t.timestamp <(T *):T1 – Shaun07776

相關問題