RO>SELECT
RO> *,
RO> (value - LAG(value) OVER(ORDER BY sensor_id, ts)) /
RO> (ts - LAG(ts) OVER(ORDER BY sensor_id, ts)) AS rate
RO>FROM
RO> scans
RO>WHERE
RO> sensor_id = LAG(sensor_id) OVER(ORDER BY sensor_id, ts)
RO>
Вот тут правильнее бы использовать клаузу "partition by", тогда все записи с одинаковым значением sensor_id будут обрабываться в своей группе и независимо от остальных групп.
RO>>SELECT
RO>> *,
RO>> (value - LAG(value) OVER(ORDER BY sensor_id, ts)) /
RO>> (ts - LAG(ts) OVER(ORDER BY sensor_id, ts)) AS rate
RO>>FROM
RO>> scans
RO>>WHERE
RO>> sensor_id = LAG(sensor_id) OVER(ORDER BY sensor_id, ts)
RO>>
О>Вот тут правильнее бы использовать клаузу "partition by", тогда все записи с одинаковым значением sensor_id будут обрабываться в своей группе и независимо от остальных групп.
У меня там для этого where, потому что я не уверен, что выдаст LAG(value) OVER(PARTITION BY sensor_id ORDER BY ts) для первой записи некоторого датчика. В спецификации неясно и проверить негде.
RO>Задавать-то вопрос задают, а вот как на него отвечать? В реляционной алгебре вообще нет понятия «предыдущий».
Не понимаю, жопа есть, а слова — нет??? (С) Вовочка
БД используются не во славу реляционной алгебры, а с её помощью.
Понятие "предыдущий" можно определить в терминах утверждений-условий, что-то вроде
Пусть есть некоторое множество строк, которое можно упорядочить. Тогда "предыдущей" строкой считается, такая строка которая расположена перед текущей согласно упорядочиванию и не существует других строк между предыдущей и текущей согласно упорядочиванию.
from
scans current
inner join scans previous on-- Тогда "предыдущей" строкой считается, такая строка
previous.sensor_id = current.sensor_id and previous.ts < current.ts -- которая расположена перед текущей согласно упорядочиванию
-- и не существует других строк and not exists (
-- между предыдущей и текущей согласно упорядочиванию.select * from scans intermediate
where intermediate.sensor_id = current.sensor_id and intermediate.ts between previous.ts and current.ts
)
Здравствуйте, avpavlov, Вы писали:
A>Пусть есть некоторое множество строк, которое можно упорядочить. Тогда "предыдущей" строкой считается, такая строка которая расположена перед текущей согласно упорядочиванию и не существует других строк между предыдущей и текущей согласно упорядочиванию.
Особенно когда упорядочивание по полю, допускающему неуникальные значения.
Здравствуйте, Roman Odaisky, Вы писали:
RO>Здравствуйте, Овощ, Вы писали:
RO>>>
RO>>>SELECT
RO>>> *,
RO>>> (value - LAG(value) OVER(ORDER BY sensor_id, ts)) /
RO>>> (ts - LAG(ts) OVER(ORDER BY sensor_id, ts)) AS rate
RO>>>FROM
RO>>> scans
RO>>>WHERE
RO>>> sensor_id = LAG(sensor_id) OVER(ORDER BY sensor_id, ts)
RO>>>
О>>Вот тут правильнее бы использовать клаузу "partition by", тогда все записи с одинаковым значением sensor_id будут обрабываться в своей группе и независимо от остальных групп.
RO>У меня там для этого where, потому что я не уверен, что выдаст LAG(value) OVER(PARTITION BY sensor_id ORDER BY ts) для первой записи некоторого датчика. В спецификации неясно и проверить негде.
В postgresql это тоже отработает.
Re[5]: SQL: запрос, чтобы подсчитать производную
От:
Аноним
Дата:
28.01.10 08:12
Оценка:
O>В postgresql это тоже отработает.
Только ещё нужно вложенным запросом воспользоваться, потому, что
в pgsql аналитические функции в WHERE использовать нельзя.