2011-07-23 58 views
2

我正在上主要有以下模式現在的SELECT語句子查詢有兩個條件

Col 1 = TIMESTAMP 
Col 2 = PATIENTID 
Col 3 = ECGVALUE 

一個心電數據,我試着寫,應該是能夠選擇的所有SQL語句滿足以下條件

Row index >= n and TIMESTAMP of xth row <= TIMESTAMP of nth row + offset 

爲了進一步explaing它的行,讓我們說我在我的數據庫以下數據

1.1 ANON 1.1 
1.3 ANON 2.3 
3.5 ANON 4.3 
5.0 ANON 6.5 
6.3 ANON 7.5 
7.9 ANON 8 
8.6 ANON 9.4 

現在,我要選擇從第3行中的數據,直到數據3秒已經收集了,這意味着我的結果集應該有

3.5 ANON 2.3 *//3rd row till TIMESTAMP <= 3.5 + 3 <= 6.5* 
1.3 ANON 2.3 
3.5 ANON 4.3 
5.0 ANON 6.5 
6.3 ANON 7.5 

最後兩行被忽略作爲第一個和最後一個cannont的TIMESTAMP之間的差異超越3.所以,如果我回到我的條件,這是

Row index >= n and TIMESTAMP of xth row <= TIMESTAMP of nth row + offset 

這裏,

n: nth row from where data must be selected 
x: Any arbitary row in result set 
offset: Maximum difference between first and last TIMESTAMP of result set. 

我寫了一個工作的SQL語句上面的條件,但我認爲它沒有太多優化,因爲我是SQL新手。

SELECT TIMESTAMP, ECGVALUE 
FROM 
(
    SELECT TIMESTAMP, ECGVALUE, ROW_NUMBER() OVER() AS RN 
    FROM EKLUND.DEV_RAWECG 
) 
WHERE RN >= n AND TIMESTAMP <= 
(
    SELECT TIMESTAMP FROM 
    (
     SELECT TIMESTAMP, ROW_NUMBER() OVER() AS TM 
    ) 
    WHERE TM = n 
) + offset; 
+0

您是否知道,除非用'ORDER明確指定行的順序不能保證BY' ? –

+0

你確定?數據庫中的數據已經按ASC順序排序。 – Shivam

+0

我們正在討論查詢返回的數據順序,而不是物理存儲在數據庫中的數據順序。無論後者如何,它對前者沒有100%的影響。這些行可以並行檢索,並且爲了表現,引擎將在沒有ORDER BY的情況下從所獲得的塊中生成結果集而不關注它們的特定順序。 –

回答

1

的代碼看起來會更加清晰,如果您使用的是公用表表達式,如下所示:

WITH rownums(TIMESTAMP, ECGVALUE, RN) AS (
    SELECT TIMESTAMP, ECGVALUE, ROW_NUMBER() OVER(ORDER BY TIMESTAMP) AS RN 
    FROM EKLUND.DEV_RAWECG 
) 
SELECT allrows.TIMESTAMP, allrows.ECGVALUE, allrows.RN 
FROM rownums allrows 
    CROSS JOIN rownums rown 
WHERE rown.RN = n 
     AND allrows.RN >= n 
     AND rown.TIMESTAMP + offset >= allrows.TIMESTAMP; 
+0

非常感謝。這正是我所期待的。 – Shivam

+0

不客氣。你能把這個標記爲答案嗎?謝謝 :) –