Долго размышлял на выходных и пока пришёл к выводы, что следующую задачу
средствами чистого sql без дополнительных функций решить невозможно. Поправьте,
пожалуйста, если я неправ.
Задача: есть таблица time, alias, value. В некоторые моменты в неё вставляются
записи, для каждой записи хранится время вставки, алиас и значение. Количество
и имена возможных алиасов известны. Требуется средствами чистого sql написать
запрос, который бы:
1. Сгруппировал записи по интервалам времени (скажем, за каждые 20 минут).
2. Для каждого интервала выдал строку со столбцами: самое последнее время
вставки в этом интервале, самое позднее значение для каждого из алиасов в
формате "алиас1 значение1 [алиас2 значение2] ..."
3. Выдал строки из п.2 для каждого следующего интервала до конца таблицы.
С помощью create function всё это делается довольно легко, а вот совсем без
них?
... Jonny wanna live
GP> Здравствуйте!
GP> Долго размышлял на выходных и пока пришёл к выводы, что следующую задачу
GP> средствами чистого sql без дополнительных функций решить невозможно.
GP> Поправьте, пожалуйста, если я неправ.
GP> Задача: есть таблица time, alias, value. В некоторые моменты в неё
GP> вставляются записи, для каждой записи хранится время вставки, алиас и
GP> значение. Количество и имена возможных алиасов известны. Требуется
GP> средствами чистого sql написать запрос, который бы:
GP> 1. Сгруппировал записи по интервалам времени (скажем, за каждые 20
GP> минут).
GP> 2. Для каждого интервала выдал строку со столбцами: самое последнее время
GP> вставки в этом интервале, самое позднее значение для каждого из алиасов в
GP> формате "алиас1 значение1 [алиас2 значение2] ..." 3. Выдал строки из п.2
GP> для каждого следующего интервала до конца таблицы.
GP> С помощью create function всё это делается довольно легко, а вот совсем
GP> без них?
Hу хотя бы сервер указали. Вот, например, для Oracle (группировка по дням):
select pivot.r, max(time) time, alias,
max(value) keep (dense_rank last order by time) val
from t, (select trunc(sysdate)-rownum r
from dual connect by level < 10) pivot
where t.time>=pivot.r and t.time<pivot.r+1
and pivot.r > sysdate-20
group by pivot.r, t.alias
Если очень нужно именно транспонировать в строку, то можно засунуть в
подзапрос:
select r, max(time),
max(decode(alias,'A',val,null)) "last A",
max(decode(alias,'B',val,null)) "last B",
max(decode(alias,'C',val,null)) "last C"
from (
select pivot.r, max(time) time, alias,
max(value) keep (dense_rank last order by time) val
from t, (select trunc(sysdate)-rownum r
from dual connect by level < 10) pivot
where t.time>=pivot.r and t.time<pivot.r+1
and pivot.r > sysdate-20
group by pivot.r, t.alias
) group by r;
Решайте головоломки http://diogen.h1.ru
30 Июн 07 11:13, Andrey Bоgdanov -> Gennadij Pastuhov:
GP>> Долго размышлял на выходных и пока пришёл к выводы, что следующую
GP>> задачу средствами чистого sql без дополнительных функций решить
GP>> невозможно. Поправьте, пожалуйста, если я неправ.
[...skipped...]
AB> from dual connect by level < 10) pivot
А это разве чистый скл? Что-то мой сервер не понял это выражение...
AB> Hу хотя бы сервер указали. Вот, например, для Oracle (группировка по
AB> дням):
Прошу пардону, Postgresql8.
AB> select pivot.r, max(time) time, alias,
AB> max(value) keep (dense_rank last order by time) val
AB> from t, (select trunc(sysdate)-rownum r
AB> from dual connect by level < 10) pivot
AB> where t.time>=pivot.r and t.time<pivot.r+1
AB> and pivot.r > sysdate-20
AB> group by pivot.r, t.alias
AB> Если очень нужно именно транспонировать в строку, то можно засунуть в
AB> подзапрос:
AB> select r, max(time),
AB> max(decode(alias,'A',val,null)) "last A",
AB> max(decode(alias,'B',val,null)) "last B",
AB> max(decode(alias,'C',val,null)) "last C"
AB> from (
AB> select pivot.r, max(time) time, alias,
AB> max(value) keep (dense_rank last order by time) val
AB> from t, (select trunc(sysdate)-rownum r
AB> from dual connect by level < 10) pivot
AB> where t.time>=pivot.r and t.time<pivot.r+1
AB> and pivot.r > sysdate-20
AB> group by pivot.r, t.alias
AB> ) group by r;
Красиво, мне предложили значительно более заковыристые варианты :)
... Jonny wanna live
GP> Суббота июня 30 07 11:13 Andrey Bоgdanov писал к Gennadij Pastuhov:
AB>> Hу хотя бы сервер указали. Вот, например, для Oracle (группировка по
AB>> дням):
GP> Прошу пардону, Postgresql8.
С Postgresql не работал, но предложенный мною вариант для него скорее всего не
пойдет.
Решайте головоломки http://diogen.h1.ru