Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Помогите, пожалуйста, с запросом

8 views
Skip to first unread message

Gennadij Pastuhov

unread,
Jun 25, 2007, 7:56:14 AM6/25/07
to
Здравствуйте!

Долго размышлял на выходных и пока пришёл к выводы, что следующую задачу
средствами чистого sql без дополнительных функций решить невозможно. Поправьте,
пожалуйста, если я неправ.

Задача: есть таблица time, alias, value. В некоторые моменты в неё вставляются
записи, для каждой записи хранится время вставки, алиас и значение. Количество
и имена возможных алиасов известны. Требуется средствами чистого sql написать
запрос, который бы:

1. Сгруппировал записи по интервалам времени (скажем, за каждые 20 минут).
2. Для каждого интервала выдал строку со столбцами: самое последнее время
вставки в этом интервале, самое позднее значение для каждого из алиасов в
формате "алиас1 значение1 [алиас2 значение2] ..."
3. Выдал строки из п.2 для каждого следующего интервала до конца таблицы.

С помощью create function всё это делается довольно легко, а вот совсем без
них?

... Jonny wanna live

Andrey Bоgdanov

unread,
Jun 30, 2007, 2:13:34 AM6/30/07
to
Mon Jun 25 2007 17:56, Gennadij Pastuhov wrote to All:

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

Denis Chernayev

unread,
Jun 30, 2007, 10:15:00 PM6/30/07
to
Hi, Andrey!

30 Июн 07 11:13, Andrey Bоgdanov -> Gennadij Pastuhov:

GP>> Долго размышлял на выходных и пока пришёл к выводы, что следующую

GP>> задачу средствами чистого sql без дополнительных функций решить
GP>> невозможно. Поправьте, пожалуйста, если я неправ.


[...skipped...]

AB> from dual connect by level < 10) pivot

А это разве чистый скл? Что-то мой сервер не понял это выражение...

Gennadij Pastuhov

unread,
Jul 1, 2007, 11:24:20 PM7/1/07
to
Суббота июня 30 07 11:13 Andrey Bоgdanov писал к Gennadij Pastuhov:

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

Andrey Bоgdanov

unread,
Jul 3, 2007, 12:25:07 PM7/3/07
to
Mon Jul 02 2007 09:24, Gennadij Pastuhov wrote to Andrey Bоgdanov:

GP> Суббота июня 30 07 11:13 Andrey Bоgdanov писал к Gennadij Pastuhov:

AB>> Hу хотя бы сервер указали. Вот, например, для Oracle (группировка по
AB>> дням):

GP> Прошу пардону, Postgresql8.

С Postgresql не работал, но предложенный мною вариант для него скорее всего не
пойдет.

Решайте головоломки http://diogen.h1.ru

0 new messages