powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как сконструировать запрос?
9 сообщений из 9, страница 1 из 1
Как сконструировать запрос?
    #34763691
jute
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброе время суток.

Пусть есть таблица test из 3-х колонок:
Код: plaintext
1.
stamp timestamp, serie integer, value integer.
В таблице такие данные:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
----------------------------------------------------
stamp                  serie             value
----------------------------------------------------
 2007 - 08 - 30   10 : 10 : 00      1                     1000 
 2007 - 08 - 30   10 : 10 : 20      2                     2000 
 2007 - 08 - 30   11 : 11 : 02      1                      100 
 2007 - 08 - 30   11 : 25 : 09      2                     3000 
 2007 - 08 - 30   12 : 30 : 00      1                     1000 
 2007 - 08 - 30   12 : 40 : 10      2                     3000 
 2007 - 08 - 30   12 : 50 : 22      3                    10000 

Необходимо сформировать выборку локальных максимумов, т.е. такие строки:
Код: plaintext
1.
2.
3.
4.
5.
6.
----------------------------------------------------
stamp                  serie             value
----------------------------------------------------
 2007 - 08 - 30   10 : 10 : 20      2                     2000 
 2007 - 08 - 30   11 : 25 : 09      2                     3000 
 2007 - 08 - 30   12 : 50 : 22      3                    10000 

Вариант:

Код: plaintext
1.
2.
3.
select date_trunc('minute', t.stamp) as truncated, max(t.serie), max(t.value)
  from test t
group by truncated
не подходит, т.к. интервал (minute, hour, etc.) заранее не известен. Итеративного решения также хотелось бы избежать.
Когда-то что-то подобное решал, но не помню как.

Благодарствую за содержательные советы.
...
Рейтинг: 0 / 0
Как сконструировать запрос?
    #34763819
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наверное проще функцией на plpgsql последовательно читать таблицу в порядке возрастания даты, сохранять переменные value, value_prev, value_prev_prev, и выдавать строку prev если value < value_prev > value_prev_prev.

Или сделать двойной self-join таблиц test, test as test_prev, test as test_next со сдвигом по дате на +-1 позицию, и выбрать только строки удовлетворяющие условию where value > value_prev and value > value_next.
...
Рейтинг: 0 / 0
Как сконструировать запрос?
    #34763867
assa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LeXa NalBatНаверное проще ... смело.
я, честно говоря так и не понял постановку задачи. (в изначальном описании она, мне кажется, отсутствует, а с телепатией у меня сегодня слабо). Ждём-с.
...
Рейтинг: 0 / 0
Как сконструировать запрос?
    #34763908
jute
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
assa LeXa NalBatНаверное проще ... смело.
я, честно говоря так и не понял постановку задачи. (в изначальном описании она, мне кажется, отсутствует, а с телепатией у меня сегодня слабо). Ждём-с.
Из таблицы, содержащей значения, имеющие временную метку и номер серии данных, нужно сформировать выборку значений из каждой последней серии. Номер серии не является уникальным и может сбрасываться, как это видно из приведенного примера. Timestamp, ессно, нет.
Ждём-с...
...
Рейтинг: 0 / 0
Как сконструировать запрос?
    #34763960
assa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jute assa LeXa NalBatНаверное проще ... смело.
я, честно говоря так и не понял постановку задачи. (в изначальном описании она, мне кажется, отсутствует, а с телепатией у меня сегодня слабо). Ждём-с.
Из таблицы, содержащей значения, имеющие временную метку и номер серии данных, нужно сформировать выборку значений из каждой последней серии. Номер серии не является уникальным и может сбрасываться, как это видно из приведенного примера. Timestamp, ессно, нет.
Ждём-с...т.е. предполагается, что у вас
1. записи идут в порядке роста таймстампа.
2. любой сбой (снижение номера) в нумерации серии - есть признак завершения?
3. выдать надо не max(value) а именно строку с последним измерением?

если все это верно, то
1. самое простое идти в отсортированном по таймстапу FOR ... IN SELECT Loop-е в plpgsql и следить за монотонностью seria , при сбросе - плеваться RETURN NEXT-ом.

2. в SQL проще конечно предположить, что и нумерация серий у вас идет без пропусков и т.д. т.п. наворочать можно, будет немножко страшненько и не шибко шустро, хотя, имхо, удачнее, если бы вы всю сплошную серию нумеровали одним номером, а не номером измерения в серии. (ну или дополнили струткуру идентификатором серии).
...
Рейтинг: 0 / 0
Как сконструировать запрос?
    #34764015
ShadyAngel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вы мне мозг взорвете. Серия играет какую то роль? Или надо просто выбрать те строки, значение в которых больше чем значения в предыдущей и в последующей строке?
...
Рейтинг: 0 / 0
Как сконструировать запрос?
    #34764071
assa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
.....
DECLARE
   _rec RECORD;
   _serie int;
BEGIN
    _serie := 0 ;
    FOR _rec IN SELECT t.stamp, t.serie,t.value FROM test t LOOP
       IF _rec.serie<_serie THEN
             RETURN NEXT _rec;
       END IF;
       _serie = _rec.serie;
    END LOOP;
RETURN;
END;
-кажется что-то в этом духе автору нужно
...
Рейтинг: 0 / 0
Как сконструировать запрос?
    #34764087
ShadyAngel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
juteИтеративного решения также хотелось бы избежать.
:(
...
Рейтинг: 0 / 0
Как сконструировать запрос?
    #34764213
assa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShadyAngel juteИтеративного решения также хотелось бы избежать.
:(? yt gjyznyj ?xnj fdnjh cxbnftn bnthfnbdysv
непонятно, что автор считает итеративным. Т.к. имхо итеративно - последовательным приближением.

т.к. "серия" автором забита для единичного измерения в серии, будем называть серию - "группой серий" , а измерение - "серией" (как это сделал автор)

т.к для нормального джойна в группе(серии) (даже с разрывом в 1 в нумерации серии(измерений)) не хватает собственно идентификатора группы ,то придется извращаться - проверять
SELECT seria FROM test t2 WHERE t2.stamp > t1.stamp ORDER BY stamp LIMIT 1
т.е. видимо так:
SELECT * FROM test t1
WHERE t1.seria>(SELECT seria FROM test t2 WHERE t2.stamp > t1.stamp ORDER BY stamp LIMIT 1);
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как сконструировать запрос?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]