
Victor
13.07.2017
10:50:55
решать естественно можно разными способами

Mike
13.07.2017
10:52:19

Айтуар
13.07.2017
10:52:37

raksita
13.07.2017
10:53:18
pgadmin скорее
для отладки в pgadmin надо сервер настраивать, для ems manager не нужно, но он платный

Google

Andrey
13.07.2017
10:53:19

Mike
13.07.2017
10:53:21

Mike Chuguniy
13.07.2017
10:54:57

Айтуар
13.07.2017
11:01:45
Вот причина дублей

Артур
13.07.2017
11:04:50

Victor
13.07.2017
11:05:24
и да, как вариант - завести столбец с индексом, но это показывает что человек не знает про ctid
вообще правильного ответа нет, просто смотрят какие способы человек предлагает

Артур
13.07.2017
11:08:15
ну я бы (при текущих знаниях):
а) создал бы доп поле (например unique_ID) в таблице с foreign на PK той же таблицы
б) написал бы Проуедуру (или UPDATE если получится) на определение дубликатов(group by по правилам) и обновление поля uique_ID
потом всё это проанализировал бы и тогда уже делал выводы, можно что- то объединять или нет
Хотя полные дубликаты - это идентичные записи же.

Google

Victor
13.07.2017
11:12:10

Артур
13.07.2017
11:12:49
хотя нет в обоих случаях так сделал бы.
Можно ще конечно сделать абсолютную копию таблицы с добавленным уникальным индексом и добавлять по правилу INSERT ON CONFLICT DO NOTHING
Но меня больше беспокоит PK
А если он где-то связан?
тогда бездумно собирать дубли нельзя и перегонять из таблицы в таблицу не получится

Victor
13.07.2017
11:21:34

Артур
13.07.2017
11:22:21
Есть ещё хитрый вариант ? Заюзать запросы в PG, а обработку написать на бэкенде :)

Sirojiddin
13.07.2017
11:28:05
Спасива вам мне запис dbf??

Igor
13.07.2017
11:39:35
Ребят, подскажите пожалуйста в каком направлении двигаться
из таблицы повытягивать записи с максимальным Value, сгруппированные по external_id, сравнивая только те значения, в которых timestamp'ы не старее от самой верхней(новой) записи в текущей группе по времени чем на 30 дней
external_id value timestamp
------------- ------- -------------------
1 10 2016-10-01
1 5 2016-09-01
3 8 2016-10-01
3 10 2016-09-01
3 12 2016-08-01в итоге что бы из этой таблицы вышло
external_id value timestamp
------------- ------- -------------------
1 10 2016-10-01
3 10 2016-09-01

Igor
13.07.2017
11:41:53
select external_id, max(value), max(timestamp) from table group by external_id having timestamp >= ...; не?
а, не, сорри

Ilya
13.07.2017
11:42:23
Там логика чет больно сложная

Igor
13.07.2017
11:43:03
целый день думаю
важно что бы от самой новой записи в группе не больше 30 дней прошло, только тогда эти значения можно сравнивать

Артур
13.07.2017
11:50:30
а если вложенный запрос написать
?

Denis
13.07.2017
11:51:55
Оконные функции вам должны помочь

Артур
13.07.2017
11:51:58

Igor
13.07.2017
11:54:33

Google

Артур
13.07.2017
11:55:21
ну как бы да. 1 сек
точнее час
я сию минуту не смогу протестировать и написать. Но суть такая, сначала выбрать все верхние значения, потом эту выборку связать с таблицей используя значения в качестве условий

Andrey
13.07.2017
12:13:08
create table test as
select (random()*5)::int as external_id,
(random()*100)::int as value,
'2017-01-01'::date + interval '1 day' * (random()*355)::int as "timestamp"
from generate_series(1, 1000) t;
with
prepared as
(
select external_id,
value,
"timestamp",
max("timestamp") over(partition by external_id) - interval '30 days' as max_timestamp
from test
group by external_id, value, "timestamp"
)
select external_id,
max(value)
from prepared
where "timestamp" > max_timestamp
group by 1;
Если я правильно понял условие.

Igor
13.07.2017
12:21:04
Мне кажется да, секунду, я попробую, но в любом случае спасибо за потраченное время

Denis
13.07.2017
12:38:37
with test (external_id, value, timestamp) as (
values (1,10,'2016-10-01'::timestamp),
(1,5,'2016-09-01'::timestamp),
(3,8,'2016-10-01'::timestamp),
(3,10,'2016-09-01'::timestamp),
(3,12,'2016-08-01'::timestamp)
),
max_stamp as (
select external_id, max(timestamp) as timestamp from test
group by external_id
),
max_value as (
select r.external_id, max(r.value) as value from (
select t.external_id, t.value from test as t
join max_stamp as g using (external_id)
where t.timestamp between (g.timestamp - interval '30 days') and g.timestamp
) as r group by r.external_id
)
select external_id, value, timestamp from test
where (external_id, value) = any (
select external_id, value from max_value
);

Masha
13.07.2017
13:54:06
Уважаемые программисты, подскажите, где можно найти dba postgres и программист тыщ так за 160-180? И чтоб на удаленку не сбежал? Такие существуют?

Darafei
13.07.2017
13:54:33
а dba postgres или программист?

Masha
13.07.2017
13:54:59
2 вакансии, не могу закрыть

عاصم بن حارث
13.07.2017
13:55:04

Masha
13.07.2017
13:55:17
Москва, Калужская

عاصم بن حارث
13.07.2017
13:55:36

Andrey
13.07.2017
13:56:05
Манго )

Maks
13.07.2017
13:56:23
"хочу всё и сразу"

Masha
13.07.2017
13:56:34
Ну, полагаю, только 18+))). Главное для dba, чтоб администрировал постгрес.

عاصم بن حارث
13.07.2017
13:56:41

Masha
13.07.2017
13:56:58
Ага, Андрей, Манго. На хх мало спецов, их вообще мало

عاصم بن حارث
13.07.2017
13:57:50

Fike
13.07.2017
13:58:13
Приложите ссылки на сами вакансии с хх.ру, пожалуйста

Google

Mike Chuguniy
13.07.2017
14:04:00
В манго найти адекватного человека, и чтобы не сбежал? Я хочу это видеть!
Пару лет назад отправлял им резюм, получил отлуп. Полез в интернеты читать, что за компания. Порадовался, что получил отлуп.

Сергей
13.07.2017
14:08:09
а че за манго?

Fike
13.07.2017
14:08:29
очевидно https://www.mango-office.ru/

Masha
13.07.2017
14:11:19
Блин, вот вы шустрые, мои запросы медленно работают))). Оптимизация нужна))). Https://hh.ru/vacancy/20608668
Сейчас вторую скину.


Евгений
13.07.2017
14:13:20
Всем привет! Подскажите пожалуйста как разрулить ситуацию с разворачиванием json по колонкам
Исходные данные такие:
CREATE TYPE mkey AS (
mtype int4,
mid int4
);
CREATE TABLE tbl (
field_1 varchar,
field_2 int4,
mkeys json
);
INSERT INTO tbl VALUES (1,1,'[{"mtype":1, "mid":11},{"mtype":1, "mid":22}]'::json);
—-------------------
Нужно получить строки таблицы "сJOINненые"" со значениями массива из колонки mkeys::json
Те нужно получить вот так:
field_1 | field_2 | mtype | mid
—-------+---------+-------+---—
1 | 1 | 1 | 11
1 | 1 | 1 | 22
Пробую:
SELECT *
FROM tbl a
LEFT JOIN json_array_elements(a.mkeys) ON TRUE;
field_1 | field_2 | mkeys | value
—-------+---------+-----------------------------------------------+---------------------—
1 | 1 | [{"mtype":1, "mid":11},{"mtype":1, "mid":22}] | {"mtype":1, "mid":11}
1 | 1 | [{"mtype":1, "mid":11},{"mtype":1, "mid":22}] | {"mtype":1, "mid":22}
Далее пробую "разложить" по колонкам
SELECT *
FROM tbl a
LEFT JOIN json_populate_record(null::mkey, json_array_elements(a.mkeys)) ON TRUE;
но получаю ошибку (
[Err] ERROR: set-valued function called in context that cannot accept a set

Admin
ERROR: S client not available

Masha
13.07.2017
14:14:24
Черт, вакансии dba нет в открытом доступе. Кому интересно, напишите в личку почту, скину. Обещаю никогда не спамить. Спасибо)))


raksita
13.07.2017
14:20:15
Всем привет! Подскажите пожалуйста как разрулить ситуацию с разворачиванием json по колонкам
Исходные данные такие:
CREATE TYPE mkey AS (
mtype int4,
mid int4
);
CREATE TABLE tbl (
field_1 varchar,
field_2 int4,
mkeys json
);
INSERT INTO tbl VALUES (1,1,'[{"mtype":1, "mid":11},{"mtype":1, "mid":22}]'::json);
—-------------------
Нужно получить строки таблицы "сJOINненые"" со значениями массива из колонки mkeys::json
Те нужно получить вот так:
field_1 | field_2 | mtype | mid
—-------+---------+-------+---—
1 | 1 | 1 | 11
1 | 1 | 1 | 22
Пробую:
SELECT *
FROM tbl a
LEFT JOIN json_array_elements(a.mkeys) ON TRUE;
field_1 | field_2 | mkeys | value
—-------+---------+-----------------------------------------------+---------------------—
1 | 1 | [{"mtype":1, "mid":11},{"mtype":1, "mid":22}] | {"mtype":1, "mid":11}
1 | 1 | [{"mtype":1, "mid":11},{"mtype":1, "mid":22}] | {"mtype":1, "mid":22}
Далее пробую "разложить" по колонкам
SELECT *
FROM tbl a
LEFT JOIN json_populate_record(null::mkey, json_array_elements(a.mkeys)) ON TRUE;
но получаю ошибку (
[Err] ERROR: set-valued function called in context that cannot accept a set
сделайте сначала cte с отдельным set из json_array_elements, потом уже выборку с populate


Евгений
13.07.2017
14:24:09

raksita
13.07.2017
14:24:37

Евгений
13.07.2017
14:24:54

raksita
13.07.2017
14:36:10
спасибо
немного напутал, в вашем случае можно через recordset:
WITH tbl (field1, field2, mkeys) AS (VALUES ('1', 1,'[{"mtype":1, "mid":11},{"mtype":1, "mid":22}]'::JSON))
SELECT
tbl.field1, tbl.field2, r.*
FROM
tbl, json_to_recordset (tbl.mkeys) AS r (mtype INT, mid INT)

Евгений
13.07.2017
14:39:08
немного напутал, в вашем случае можно через recordset:
WITH tbl (field1, field2, mkeys) AS (VALUES ('1', 1,'[{"mtype":1, "mid":11},{"mtype":1, "mid":22}]'::JSON))
SELECT
tbl.field1, tbl.field2, r.*
FROM
tbl, json_to_recordset (tbl.mkeys) AS r (mtype INT, mid INT)
это работает! еще раз спасибо

raksita
13.07.2017
14:42:25

Dmitry
13.07.2017
15:22:32
привет, а никто не знает как pg large object хранит? в relation также?
https://momjian.us/main/writings/pgsql/aw_pgsql_book/node95.html
в смысле если я создам table (name CHAR(30), image OID) для image будет использоваться один толстый relation как toast?
да с сжатием, как toast

Pavel
13.07.2017
15:40:53

Google

Pavel
13.07.2017
15:41:12
Именно поэтому и bytea vs oid

Bogdan (SirEdvin)
13.07.2017
15:41:51
Хм .. а можно кто подсказать, можно как-то выяснить реальное количество памяти, которое использует postgres?


Dmitry
13.07.2017
15:42:16
Точно? ПО-моему внешние файлы... могу ошибаться, но все же
postgres=# INSERT INTO data VALUES ('big', lo_import('/test.file.big'));
INSERT 0 1
postgres=# INSERT INTO data VALUES ('big2', lo_import('/test.file.big'));
INSERT 0 1
postgres=#
/test.file.big - 1Gb который хорошо жметься
postgres=# INSERT INTO data VALUES ('big3', lo_import('/test.file.big'));
INSERT 0 1
postgres=#
postgres=# INSERT INTO data VALUES ('big4', lo_import('/test.file.big'));
INSERT 0 1
postgres=#
postgres=# INSERT INTO data VALUES ('big5', lo_import('/test.file.big'));
INSERT 0 1
postgres=#
postgres=# INSERT INTO data VALUES ('big6', lo_import('/test.file.big'));
INSERT 0 1
postgres=#
[root@localhost ~]# ls -lah /var/lib/pgsql/9.6/data/base/13275/2613*
-rw-------. 1 postgres postgres 1.0G Jul 13 08:40 /var/lib/pgsql/9.6/data/base/13275/2613
-rw-------. 1 postgres postgres 421M Jul 13 08:42 /var/lib/pgsql/9.6/data/base/13275/2613.1
-rw-------. 1 postgres postgres 384K Jul 13 08:42 /var/lib/pgsql/9.6/data/base/13275/2613_fsm
-rw-------. 1 postgres postgres 0 Jul 13 08:29 /var/lib/pgsql/9.6/data/base/13275/2613_vm


Pavel
13.07.2017
15:43:20


Dmitry
13.07.2017
15:43:35
но жмет
накой
кто просил

Pavel
13.07.2017
15:44:13

Игорь
13.07.2017
15:45:07

Dmitry
13.07.2017
15:45:35
он наверно про разделяемую беспокоиться

Bogdan (SirEdvin)
13.07.2017
15:47:47
а вы для чего спрашиваете? беспокоит "большой" чекпоинтер?
Я довольно слабо знаком с системой логики работы памяти в линуксе, а у нас тут возникли проблемки. Вот у меня вроде реальной памяти 32Г, а Commit Limit всего 19 и не могу понять, куда делать остальная память)
Пока предполагаю, что все укатилось в shared + mapped, но фиг его знает.
Ну и интересно, как понять, сколько всего постгрес сьел.

Dmitry
13.07.2017
15:48:55
хотел бы побить на кучку не гиганстких relation
Да, не файлы, но и не TOAST. В pg_largeobject хранится
postgres=# \d+ pg_largeobject
Table "pg_catalog.pg_largeobject"
Column | Type | Modifiers | Storage | Stats target | Description
—------+---------+-----------+----------+--------------+-------------
loid | oid | not null | plain | |
pageno | integer | not null | plain | |
data | bytea | not null | extended | |
Indexes:
"pg_largeobject_loid_pn_index" UNIQUE, btree (loid, pageno)
блин, тотже bytea


Bogdan (SirEdvin)
13.07.2017
15:55:09

Dmitry
13.07.2017
16:06:26
остальное - обычная выделенная память, которую можно посчитать по процессам