powered by simpleCommunicator - 2.0.28     © 2024 Programmizd 02
Map
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Выполнение запроса в цикле на уровне SQL запроса
10 сообщений из 10, страница 1 из 1
Выполнение запроса в цикле на уровне SQL запроса
    #40138692
qwerty5000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго времени суток!
Коллеги, требуется помощь в решении задачки.
Дано:
Имеется вот такой запрос который транспонирует временной ряд в более реляционный вид (запрос упрощен и представлен для одного тега).
Запрос вытаскивает последнее значение за сутки.
На вход получаю произвольную дату на основе которой необходимо сформировать отчет за месяц, пусть будет 19.07.2024
Код: SQL
1.
2.
3.
4.
5.
6.
7.
SELECT
'Дата' AS repdate,
CASE WHEN t1.tagname = 'ASRMB.U_AVT12.FT0002.Out.Mt' THEN t1.dvalue END AS ASRMB_U_AVT12_FT0002_Out_Mt,
FROM (
SELECT case when h.recordtype = 'inner' then h.valdouble else NULL END AS dValue, h.time, n.tagname
FROM nodes_history h JOIN nodes n ON n.NodeId = h.NodeId
WHERE n.TagName = 'ASRMB.U_AVT12.FT0002.Out.Mt' AND (h.time BETWEEN '2024-07-18 00:00:00.00' AND '2024-07-18 23:59:59.00') AND h.recordtype != 'ubound' ORDER BY h.time DESC LIMIT 1) t1
Нужно:
На уровне SQL запроса, как-то разложить дату от 19 числа по 1 число с шагом в сутки.
Поочередно подставить каждую дату в запрос и в результате получить набор значений по дням с 1 по 19 число месяца.
Буду очень признателен за любую посильную помощь, времени совсем нет, а заказчик не ждет.
Спасибо!
...
Рейтинг: 0 / 0
Выполнение запроса в цикле на уровне SQL запроса
    #40138693
чебуран
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я думаю вам надо в подзапросе сгенерировать нужные даты, как тут

https://stackoverflow.com/questions/14113469/generating-time-series-between-two-dates-in-postgresql

и сджойнить их с вашим запросом
...
Рейтинг: 0 / 0
Выполнение запроса в цикле на уровне SQL запроса
    #40138694
qwerty5000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чебуран  19.07.2024, 13:37
[игнорируется]
Я думаю вам надо в подзапросе сгенерировать нужные даты, как тут

https://stackoverflow.com/questions/14113469/generating-time-series-between-two-dates-in-postgresql

и сджойнить их с вашим запросом
Похоже на правду) Спасибо. Не могу понять как правильно джойнить. Задача не профильная. Настоящий запрос два дня делал)
...
Рейтинг: 0 / 0
Выполнение запроса в цикле на уровне SQL запроса
    #40138697
qwerty5000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чебуран  19.07.2024, 13:37
[игнорируется]
Я думаю вам надо в подзапросе сгенерировать нужные даты, как тут

https://stackoverflow.com/questions/14113469/generating-time-series-between-two-dates-in-postgresql

и сджойнить их с вашим запросом
Спасибо. Вот такую структуру собрал, но не работает, вообще у такой структуры есть шансы на жизнь? Может укажете на ошибки которые в глаза бросаются
Код: PL/pgSQL
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
CREATE TEMPORARY TABLE temp_table (value double, rdate timestamp, name text);
do $$
declare iCounter intenger:= 1;
declare iIter intenger:= 0;
declare iValue double:= NULL;
declare rDate timestamp:= NULL;
declare strName text:= NULL;
begin
  while iCounter <= SELECT EXTRACT(DAY FROM TIMESTAMP '2024-07-19 00:00:00.00') loop
    iIter = iIter + 1;
    SELECT @iValue = case when h.recordtype = 'inner' then h.valdouble else NULL END AS dValue, @rDate =  h.time, @strName = n.tagname FROM nodes_history h JOIN nodes n ON n.NodeId = h.NodeId
    WHERE n.TagName = 'ASRMB.U_AVT12.FT0038.Out.Mt' AND (h.time BETWEEN (SELECT '2024-07-19'::timestamp - INTERVAL iIter + 1 DAY)  AND (SELECT '2024-07-19'::timestamp - INTERVAL iIter DAY) AND h.recordtype != 'ubound' ORDER BY h.time DESC LIMIT 1
    INSERT INTO temp_table VALUES (@iValue, @rDate, @strName);
end loop;
end $$;

Drop table temp_table;
...
Рейтинг: 0 / 0
Выполнение запроса в цикле на уровне SQL запроса
    #40138698
CerebroSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwerty5000 [игнорируется] 

Вот у такой есть шанс на жизнь:
Код: PL/pgSQL
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
CREATE  TABLE temp_table (value integer, rdate timestamp, name text);
do $$
declare iCounter integer:= 1;
declare iIter integer:= 0;
declare iValue integer:= NULL;
declare rDate timestamp:= NULL;
declare strName text:= NULL;
begin
  while iIter < 10 loop
    iIter = iIter + 1;
    select now(), 1, 'text' into rDate,iValue, strName;
    INSERT INTO temp_table VALUES (iValue, rDate, strName);
end loop;
end $$;

select * from temp_table;
...
Рейтинг: 0 / 0
Выполнение запроса в цикле на уровне SQL запроса
    #40138699
qwerty5000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CerebroSQL  19.07.2024, 20:50
[игнорируется]
qwerty5000 [игнорируется] 

Вот у такой есть шанс на жизнь:
Код: PL/pgSQL
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
CREATE  TABLE temp_table (value integer, rdate timestamp, name text);
do $$
declare iCounter integer:= 1;
declare iIter integer:= 0;
declare iValue integer:= NULL;
declare rDate timestamp:= NULL;
declare strName text:= NULL;
begin
  while iIter < 10 loop
    iIter = iIter + 1;
    select now(), 1, 'text' into rDate,iValue, strName;
    INSERT INTO temp_table VALUES (iValue, rDate, strName);
end loop;
end $$;

select * from temp_table;
упростил запрос, все равно ругается
Код: SQL
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
Drop table temp_table;
CREATE  TABLE temp_table (value integer, rdate timestamp, name text);
do $$
declare iCounter integer:= 1;
declare iIter integer:= 0;
declare iValue integer:= NULL;
declare rDate timestamp:= NULL;
declare strName text:= NULL;
begin
  while iIter < (SELECT EXTRACT(DAY FROM TIMESTAMP '2024-07-19 00:00:00.00')) loop
    iIter = iIter + 1;
    SELECT iValue = (case when h.recordtype = 'inner' then h.valdouble else NULL END AS dValue), rDate =  h.time, strName = n.tagname FROM nodes_history h JOIN nodes n ON n.NodeId = h.NodeId
    WHERE n.TagName = 'ASRMB.U_AVT12.FT0038.Out.Mt' AND (h.time BETWEEN ('2024-07-15')  AND ('2024-07-19')) AND h.recordtype != 'ubound' ORDER BY h.time DESC LIMIT 1
    INSERT INTO temp_table VALUES (iValue, rDate, strName);
end loop;
end $$;
select * from temp_table;
ERROR: ошибка синтаксиса (примерное положение: "AS") LINE 13: ...cordtype = 'inner' then h.valdouble else NULL END AS dValue)... ^ ОШИБКА: ошибка синтаксиса (примерное положение: "AS") SQL state: 42601 Character: 445
...
Рейтинг: 0 / 0
Выполнение запроса в цикле на уровне SQL запроса
    #40138700
qwerty5000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwerty5000 [игнорируется] 

Теперь что-то непонятное получаю
Код: SQL
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
Drop table temp_table;
CREATE  TABLE temp_table (value integer, rdate timestamp, name text);
do $$
declare iCounter integer:= 1;
declare iIter integer:= 0;
declare iValue double precision:= NULL;
declare rDate timestamp:= NULL;
declare strName text:= NULL;
begin
  while iIter < (SELECT EXTRACT(DAY FROM TIMESTAMP '2024-07-19 00:00:00.00')) loop
    iIter = iIter + 1;
    SELECT iValue = case when h.recordtype = 'inner' then h.valdouble else NULL END AS dValue, rDate =  h.time, strName = n.tagname FROM nodes_history h JOIN nodes n ON n.NodeId = h.NodeId
    WHERE n.TagName = 'ASRMB.U_AVT12.FT0038.Out.Mt' AND (h.time BETWEEN ('2024-07-15')  AND ('2024-07-19')) AND h.recordtype != 'ubound' ORDER BY h.time DESC LIMIT 1;
    INSERT INTO temp_table VALUES (iValue, rDate, strName);
end loop;
end $$;
select * from temp_table;
ПРЕДУПРЕЖДЕНИЕ: Обнаружен устаревший параметр конфигураци: 'aehistorianname'. Его поддержка будет прекращена в следующей версии! ПРЕДУПРЕЖДЕНИЕ: Обнаружен устаревший параметр конфигураци: 'historianname'. Его поддержка будет прекращена в следующей версии! ПРЕДУПРЕЖДЕНИЕ: Обнаружен устаревший параметр конфигураци: 'sourceae'. Его поддержка будет прекращена в следующей версии! ПРЕДУПРЕЖДЕНИЕ: Обнаружен устаревший параметр конфигураци: 'sourceda'. Его поддержка будет прекращена в следующей версии! ERROR: в запросе нет назначения для данных результата HINT: Если вам нужно отбросить результаты SELECT, используйте PERFORM. CONTEXT: функция PL/pgSQL inline_code_block, строка 10, оператор SQL-оператор ОШИБКА: в запросе нет назначения для данных результата SQL state: 42601
...
Рейтинг: 0 / 0
Выполнение запроса в цикле на уровне SQL запроса
    #40138701
qwerty5000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
разобрался, вот такая конструкция работает, но почему-то когда начинаю вводить переменную вместо жесткой даты материт
Код: SQL
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
Drop table temp_table;
CREATE  TABLE temp_table (value integer, rdate timestamp, name text);
do $$
--declare iCounter integer:= 1;
declare iIter integer:= 0;
declare iValue double precision:= NULL;
declare reportDate timestamp:= '2024-07-19';

declare rDate timestamp:= NULL;
declare strName text:= NULL;
declare iDay int:= (SELECT EXTRACT(DAY FROM TIMESTAMP reportDate));
begin
  while iIter < iDay loop
    iIter = iIter + 1;
    SELECT  CASE WHEN h.recordtype = 'inner' THEN h.valdouble ELSE NULL END, h.time, n.tagname
        INTO  iValue, rDate, strName
        FROM  nodes_history h
        JOIN  nodes n ON n.NodeId = h.NodeId

    WHERE n.TagName = 'ASRMB.U_AVT12.FT0038.Out.Mt' AND (h.time BETWEEN ('2024-07-18')  AND ('2024-07-19')) AND h.recordtype != 'ubound' ORDER BY h.time DESC LIMIT 1;
    INSERT INTO temp_table VALUES (iIter, rDate, strName);
end loop;
end $$;
select * from temp_table ;
ERROR: ошибка синтаксиса (примерное положение: "reportDate") LINE 12: ...are iDay int:= (SELECT EXTRACT(DAY FROM TIMESTAMP reportDate... ^ ОШИБКА: ошибка синтаксиса (примерное положение: "reportDate") SQL state: 42601 Character: 361
...
Изменено: 22.07.2024, 15:31 - qwerty5000
Рейтинг: 0 / 0
Выполнение запроса в цикле на уровне SQL запроса
    #40138702
CerebroSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwerty5000 [игнорируется] 

Замените extract на date_part('day', reportDate);
...
Рейтинг: 0 / 0
Выполнение запроса в цикле на уровне SQL запроса
    #40138703
qwerty5000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CerebroSQL [игнорируется] 

Спасибо! Сработало)
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Выполнение запроса в цикле на уровне SQL запроса
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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