Re[2]: SQL: запрос, чтобы подсчитать производную
От: Овощ http://www.google.com
Дата: 25.01.10 07:50
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:

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 будут обрабываться в своей группе и независимо от остальных групп.

... over (partition by sensor_id order by ts) ...

Re[3]: SQL: запрос, чтобы подсчитать производную
От: Roman Odaisky Украина  
Дата: 25.01.10 08:48
Оценка:
Здравствуйте, Овощ, Вы писали:

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 будут обрабываться в своей группе и независимо от остальных групп.


У меня там для этого where, потому что я не уверен, что выдаст LAG(value) OVER(PARTITION BY sensor_id ORDER BY ts) для первой записи некоторого датчика. В спецификации неясно и проверить негде.
До последнего не верил в пирамиду Лебедева.
Re[3]: SQL: запрос, чтобы подсчитать производную
От: avpavlov  
Дата: 25.01.10 11:49
Оценка:
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 
    )
Re[4]: SQL: запрос, чтобы подсчитать производную
От: Roman Odaisky Украина  
Дата: 25.01.10 20:18
Оценка:
Здравствуйте, avpavlov, Вы писали:

A>Пусть есть некоторое множество строк, которое можно упорядочить. Тогда "предыдущей" строкой считается, такая строка которая расположена перед текущей согласно упорядочиванию и не существует других строк между предыдущей и текущей согласно упорядочиванию.


Особенно когда упорядочивание по полю, допускающему неуникальные значения.
До последнего не верил в пирамиду Лебедева.
Re[5]: SQL: запрос, чтобы подсчитать производную
От: avpavlov  
Дата: 26.01.10 08:13
Оценка:
RO>Особенно когда упорядочивание по полю, допускающему неуникальные значения.

Ну да, область применения ограничена, об этом можно будет упомянуть
Re[4]: SQL: запрос, чтобы подсчитать производную
От: oktogen  
Дата: 28.01.10 08:04
Оценка:
Здравствуйте, 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 использовать нельзя.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.