Оператор SELECT как подзапрос с двумя условиями - PullRequest
2 голосов
/ 23 июля 2011

Я работаю с данными ЭКГ, которые в основном имеют следующую схему

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

Теперь я пытаюсь написать оператор SQL, который должен иметь возможность выбрать все строки, которые удовлетворяют следующемуусловие

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

Для более подробного объяснения, скажем, у меня есть следующие данные в моей базе данных

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

Последние две строки игнорируются, так как разница между 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;

1 Ответ

1 голос
/ 23 июля 2011

Код будет выглядеть намного чище, если вы используете общее табличное выражение, как показано ниже:

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...