Size: a a a

pgsql – PostgreSQL

2021 March 11

GM

Gennady Moiseychenko in pgsql – PostgreSQL
G V
То есть по сути, я переворачиваю таблицу, но как схлопнуть строки с одинаковым временем не понимаю
не знаю насколько это вариант будет оптимальный, возможно есть лучше, но попробуй

select Время, max(Скорость), max(Расход) from (select  to_timestamp((d.source_time - 116444736000000000)::float / 10000000 ) as Время,
 case  when d.archive_itemid = 18  then Round( d.value::numeric , 2) end as Скорость,
 case  when d.archive_itemid = 17  then Round( d.value::numeric , 2) end as Расход
 from  public.data_raw d  where d.status_code = 0 and layer =0 AND (d.archive_itemid = 18 OR d.archive_itemid = 17 ) as tbl group by Время
источник

s

shoxrux in pgsql – PostgreSQL
G V
Исходно все лежит в таком формате:

layer|archive_itemid|source_time       |server_time|status_code|value             |s_value|
-----|--------------|------------------|-----------|-----------|------------------|-------|
   0|            18|132548425838890000|          0|          0|               0.0|       |
   1|            18|132548425838890000|          0|          0|               0.0|       |
   2|            18|132548425838890000|          0|          0|               0.0|       |
   0|            17|132548425838890000|          0|          0|               0.0|       |
   1|            17|132548425838890000|          0|          0|               0.0|       |
   2|            17|132548425838890000|          0|          0|               0.0|       |


То есть время одинаковое для нескольких archive_itemid
Соответственно при таком выводе, второе и третье поле имеет NULL


Хочу такой результат:

Время             |Скорость|Расход   |
------------------|--------|---------|
021-03-03 13:19:08|    2.80|659136.04|
021-03-03 12:59:08|    2.84|691019.57|
021-03-03 12:39:08|    2.70|548477.84|    Строки со временем одинаковые
Вроде, должно так и выйти

select to_timestamp((d.source_time - 116444736000000000)
                     ::float / 10000000) as время,
        case
          when d.archive_itemid = 18 then
           sum(round(d.value ::numeric, 2))
        end as скорость,
        case
          when d.archive_itemid = 17 then
           sum(round(d.value ::numeric, 2))
        end as расход
   from public.data_raw d
  where d.status_code = 0
    and layer = 0
    and (d.archive_itemid = 18 or d.archive_itemid = 17)
  order by d.source_time desc limit 100;
источник

s

shoxrux in pgsql – PostgreSQL
shoxrux
Вроде, должно так и выйти

select to_timestamp((d.source_time - 116444736000000000)
                     ::float / 10000000) as время,
        case
          when d.archive_itemid = 18 then
           sum(round(d.value ::numeric, 2))
        end as скорость,
        case
          when d.archive_itemid = 17 then
           sum(round(d.value ::numeric, 2))
        end as расход
   from public.data_raw d
  where d.status_code = 0
    and layer = 0
    and (d.archive_itemid = 18 or d.archive_itemid = 17)
  order by d.source_time desc limit 100;
group by d.source_time
источник

GV

G V in pgsql – PostgreSQL
select to_timestamp((d.source_time - 116444736000000000)
                     ::float / 10000000) as время,
        case
          when d.archive_itemid = 18 then
           sum(round(d.value ::numeric, 2))
        end as скорость,
        case
          when d.archive_itemid = 17 then
           sum(round(d.value ::numeric, 2))
        end as расход
   from public.data_raw d
  where d.status_code = 0
    and layer = 0
    and (d.archive_itemid = 18 or d.archive_itemid = 17)
    group by d.source_time
  order by d.source_time desc limit 100;

  Выдает ошибку
  SQL Error [42803]: ОШИБКА: столбец "d.archive_itemid" должен фигурировать в предложении GROUP BY или использоваться в агрегатной функции
 Позиция: 143
 Но ход мыслей понятен, надо строки в объединении каким то образом обработать с единственным выходным результатом
источник

GM

Gennady Moiseychenko in pgsql – PostgreSQL
Gennady Moiseychenko
не знаю насколько это вариант будет оптимальный, возможно есть лучше, но попробуй

select Время, max(Скорость), max(Расход) from (select  to_timestamp((d.source_time - 116444736000000000)::float / 10000000 ) as Время,
 case  when d.archive_itemid = 18  then Round( d.value::numeric , 2) end as Скорость,
 case  when d.archive_itemid = 17  then Round( d.value::numeric , 2) end as Расход
 from  public.data_raw d  where d.status_code = 0 and layer =0 AND (d.archive_itemid = 18 OR d.archive_itemid = 17 ) as tbl group by Время
в данном случае как раз внутренний запрос создает строки с null'ами, а внешний группирует по времени и берет максимальное значение от 2х других колонок. В результате null'ы схлопываются
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
Kino Recovery
у меня возник интересный вопрос, а что случиться если на клиенте у меня 11я версия библиотеки а сервер 12. а в запросах активно участвует jsonpath
Какой библиотеки, libpq? Будет работать, и всё (сам протокол уже очень давно не менялся).
источник

s

shoxrux in pgsql – PostgreSQL
G V
select to_timestamp((d.source_time - 116444736000000000)
                     ::float / 10000000) as время,
        case
          when d.archive_itemid = 18 then
           sum(round(d.value ::numeric, 2))
        end as скорость,
        case
          when d.archive_itemid = 17 then
           sum(round(d.value ::numeric, 2))
        end as расход
   from public.data_raw d
  where d.status_code = 0
    and layer = 0
    and (d.archive_itemid = 18 or d.archive_itemid = 17)
    group by d.source_time
  order by d.source_time desc limit 100;

  Выдает ошибку
  SQL Error [42803]: ОШИБКА: столбец "d.archive_itemid" должен фигурировать в предложении GROUP BY или использоваться в агрегатной функции
 Позиция: 143
 Но ход мыслей понятен, надо строки в объединении каким то образом обработать с единственным выходным результатом
group by d.source_time, d.item_id  попробуйте, но думаю, что результат уже будет другим
источник

K

Kino Recovery in pgsql – PostgreSQL
Yaroslav Schekin
Какой библиотеки, libpq? Будет работать, и всё (сам протокол уже очень давно не менялся).
да libpq 11, собрать 12ю или контейнер поднять нет возможности. надо очень быстро поднять. наверху psycopg2
источник

GV

G V in pgsql – PostgreSQL
Gennady Moiseychenko
в данном случае как раз внутренний запрос создает строки с null'ами, а внешний группирует по времени и берет максимальное значение от 2х других колонок. В результате null'ы схлопываются
Большое спасибо, добавил скобку закрывающую подзапрос и заработало как надо!

select Время, max(Скорость)as Скорость, max(Расход) as Расход from (select  to_timestamp((d.source_time - 116444736000000000)::float / 10000000 ) as Время,
 case  when d.archive_itemid = 18  then Round( d.value::numeric , 2) end as Скорость,
 case  when d.archive_itemid = 17  then Round( d.value::numeric , 2) end as Расход
 from  public.data_raw d  where d.status_code = 0 and layer =0 AND (d.archive_itemid = 18 OR d.archive_itemid = 17 )) as tbl   group by Время
 order by Время desc

Результат

Время              |Скорость|Расход   |
-------------------|--------|---------|
2021-03-03 13:19:08|    2.80|659136.04|
2021-03-03 12:59:08|    2.84|691019.57|
2021-03-03 12:39:08|    2.70|548477.84|
2021-03-03 12:19:08|    2.67|629237.10|
2021-03-03 11:59:08|    2.88|711840.66|
2021-03-03 11:39:08|    2.81|671178.42|
2021-03-03 11:19:08|    2.86|670643.91|
2021-03-03 10:59:08|    2.90|660980.51|
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
Kino Recovery
да libpq 11, собрать 12ю или контейнер поднять нет возможности. надо очень быстро поднять. наверху psycopg2
Если psycopg2 не делает ничего "умного", то всё равно (т.к. протокол всё тот же, опять-таки).
Т.е. на всякий случай можно посмотреть документацию psycopg2.
источник

GV

G V in pgsql – PostgreSQL
shoxrux
group by d.source_time, d.item_id  попробуйте, но думаю, что результат уже будет другим
Так почему то и не вышло,
но все равно спасибо за помощь!
источник

SS

Stanislav Styazhkin in pgsql – PostgreSQL
всем привет! Господа товарищи, подскажите пожалуйста:
Есть ли какие-то особенности работы с непубличной  схемой?
Если есть таблицы, которые повторяют названия из схемы public, то всё работает корректно.
Но если есть таблица, которая с уникальным названием, то получаю ошибку вида: "Ошибка 42P01: отношение 'имя_таблицы' не существует"
источник

АШ

Александр Шелудченко... in pgsql – PostgreSQL
в "" попробуй
источник

K

Kino Recovery in pgsql – PostgreSQL
я опять хочу странного  у меня есть набор id после вставки и мне надо их посчитать ROW_NUMBER() я сделал такую вот штуку  
SELECT 255,id,ROW_NUMBER() over () from (select * FROM UNNEST (ARRAY[22,23,255])) as id;
но id из саб запроса не int как это побороть
источник

АЗ

Андрей Зубков... in pgsql – PostgreSQL
Kino Recovery
я опять хочу странного  у меня есть набор id после вставки и мне надо их посчитать ROW_NUMBER() я сделал такую вот штуку  
SELECT 255,id,ROW_NUMBER() over () from (select * FROM UNNEST (ARRAY[22,23,255])) as id;
но id из саб запроса не int как это побороть
SELECT 255,x,ROW_NUMBER() over () from UNNEST (ARRAY[22,23,255]) x;
подойдет?
источник

SZ

Sergey Zhuravlev in pgsql – PostgreSQL
Михаил Шурутов
ПонЕл, отстал. Мал-мала тормознул, подумал, что два отдельных докера с двумя версиями, вижу, что неправ.
сигнал — к докеру можно быть мягче, Миша )))

https://www.cybertec-postgresql.com/en/running-postgres-in-docker-why-and-how/
источник

VY

Victor Yegorov in pgsql – PostgreSQL
не надо. каждому инструменту — своё применение.
источник

VS

Vladimir Shishmarev in pgsql – PostgreSQL
Привет. Запускаю pgpool в docker через docker-compose и передаю переменные окружения. Все переменные окружения передаются нормально кроме двух. Передаю:

PGPOOL_PARAMS_BACKEND_FLAG0: 'ALLOW_TO_FAILOVER'
PGPOOL_PARAMS_BACKEND_FLAG1: 'ALLOW_TO_FAILOVER'


Но внутри контейнера в pgpool.conf вижу:

backend_flag0 = 'ALWAYS_PRIMARY|DISALLOW_TO_FAILOVER'
backend_flag1 = 'DISALLOW_TO_FAILOVER'


Все остальные переменные в pgpool.conf применяются корректно.
Кто подскажет, что не так и как корректно применить данные переменные?
источник

VS

Vladimir Shishmarev in pgsql – PostgreSQL
В официальной доке в примере для кубера написано, что нужно передавать

```
backend_flag0 = 'ALWAYS_PRIMARY|DISALLOW_TO_FAILOVER'
backend_flag1 = 'DISALLOW_TO_FAILOVER'
```

но мне в силу особенностей проекта нужно передать именно 'ALLOW_TO_FAILOVER'
источник

V

Vladi in pgsql – PostgreSQL
pg_restore: error: found unexpected block ID (-1863026888) when reading data -- expected 3233
Кто встречался с таким?
источник