
Dmitrii
28.04.2018
15:50:18
Ага
Ну я типа PoC сделал

Ilia
28.04.2018
15:50:31
OVER (
PARTITION BY request_id
ORDER BY timestamp ASC) AS next_action, LEAD(timestamp, 1, timestamp)
OVER (
PARTITION BY request_id
ORDER BY timestamp ASC) AS next_timestamp
ты вот уверен, что это правильно написано?

Dmitrii
28.04.2018
15:50:54
А почему нет? Я на бумажке посчитал, функция тоже самое выводит

Google

Dmitrii
28.04.2018
15:52:00
2-й и 3-й аргументы явно объявлены чтобы убрать NULL значения когда заканчивается временной ряд интервалов
Таким образом next_timestamp будет равен timestamp и его разница будет равна нулю

Ilia
28.04.2018
15:52:26
ну я как-то совсем не уверен

Dmitrii
28.04.2018
15:52:43
Так а что тебя конкретно смущает? Я проверю

Ilia
28.04.2018
15:52:54
а оконные фукнции для PG надо вспоминать, я не знаю их так хорошо.
Меня смущает, что нет никакого значения.
OVER ( PARTITION BY request_id ORDER BY timestamp ASC) AS next_action
вот поле, вычисляемое оконной функцией. А ГДЕ то, что собственно берётся за значение ?

Dmitrii
28.04.2018
15:53:59
Так LEAD же
Первый арг
В первом случае там action следующей строки, а второй LEAD это timestamp следующей строки
Цифровые пары — это возможные переходы (валидные) состояния которые надо затрекать (суммировать)

Ilia
28.04.2018
15:57:14
SELECT depname, empno, salary, avg(salary) OVER (PARTITION BY depname) FROM empsalary;

Google

Al
28.04.2018
15:57:14
представь как все было бы проще если просто
прочитал
посчитал
проапдейтил
сумма выбирается автоматом

Ilia
28.04.2018
15:57:29
вот пример валидного запроса с оконной функцией.

Al
28.04.2018
15:57:40
но тут явно не нужно проще.

Dmitrii
28.04.2018
15:58:04

Ilia
28.04.2018
15:58:07

Dmitrii
28.04.2018
15:58:32
Тебя видимо 3 аргумента для оконной функции с толку сбило?
Я там просто там от NULL значений избавился и все
Это был самый простой способ
Плюс архитектура append only мне нравится куда больше

Al
28.04.2018
16:01:17

Ilia
28.04.2018
16:01:32

Dmitrii
28.04.2018
16:01:42
Ну подожи, какой бизнес кейс у удаления в трекере?
Это как какахи пальцами из попы начать вытаскивать

Ilia
28.04.2018
16:03:07
А EXTRACT(EPOCH FROM (next_timestamp - timestamp))) что делает?

Dmitrii
28.04.2018
16:03:15
И кстати, даже если мне надо что-то поменять то замена будет только одной записи по pk
Кол-во секунд итоговое

Al
28.04.2018
16:05:43
Кол-во секунд итоговое
гыыыы. то есть в твоем представлени примерно так
"время занимает только отправка запроса, база ЛЮБОЙ запрос обрабатывает МНОГНОВЕННО"

Ilia
28.04.2018
16:06:06
Ну ладно, главное-то не это всё, а запустить этот запрос и получить данные.
И проверить, насколько быстро СУБД его выполняет.
Тут если сделать индекс по (request_id,timestamp) потенциально это может работать быстро.
Если будет, ок, можно и так оставлять. Если нет — надо сначала выгрызать данные

Dmitrii
28.04.2018
16:06:34

Google

Ilia
28.04.2018
16:07:00

Dmitrii
28.04.2018
16:07:12
Ага, такой вот постгрес

Al
28.04.2018
16:07:17

Ilia
28.04.2018
16:07:23
Ну ладно это в общем не важно

Al
28.04.2018
16:07:43

Dmitrii
28.04.2018
16:08:02
Там выбрка идет по owner_id, request_id сначала

Ilia
28.04.2018
16:08:18

Dmitrii
28.04.2018
16:08:32
Высекается ну максимум в худшем случае для наркоманов 50 записей

Ilia
28.04.2018
16:08:48
Ну и я бы НЕ ПИСАЛ оконку, взял бы просто self-JOIN.

Dmitrii
28.04.2018
16:10:18
Я конечно всякого в базе повидал, понимаю о чем ты но все же

Ilia
28.04.2018
16:11:40
?

Dmitrii
28.04.2018
16:12:06
Значит в этом случае я буду тем парнем из авито
Который отключает fsync в PG ради скорости вопреки риску потери данных (какой-то части)
Т.к. это будет дешевле восстановить с точки зрения бизнеса через саппорт

Ilia
28.04.2018
16:13:30
Ладно, я полагаю, что вопрос исчерпан, если ты добьешься от этого запросика приемлимой производительности (или другой напишешь),
То и ОК, если нет — думаю, тебе надо БЕЖАТЬ ВВЕРХ И ВЫДЕЛЯТЬ ЦЕПОЧКИ СОБЫТИЙ.
Я вот лично по таким подобным задачам ВСЕГДА в конце приходил к тому, что выделял.

Dmitrii
28.04.2018
16:14:41
Это ты к чему?
Ну в Авито DBA отключают на дисках fsync чтобы PG быстрее работал

Google

Dmitrii
28.04.2018
16:14:45
Дает им прирост скорости
Но если откбчат свет, то пара последних минут данных наебнется, то что не успело засинкаться на диск
И вот этот проеб данных последние Х-минут восстановить через саппорт дешевле чем купить 10 новых серверов для PG (условно) чтобы покрыть прирост произовдительности когда они вырубили fsync
Звучит дико )

Ilia
28.04.2018
16:16:30

Dmitrii
28.04.2018
16:16:47
А, ну это я к тому, что если цепочка внезапно разломается

Ilia
28.04.2018
16:16:56

Dmitrii
28.04.2018
16:17:00
И какой-то интервал не забиллится

Ilia
28.04.2018
16:17:23
А

Admin
ERROR: S client not available

Dmitrii
28.04.2018
16:17:24
Мы просто возьмем и руками его восстановим )

Ilia
28.04.2018
16:17:28
ну ок

Dmitrii
28.04.2018
16:17:47
AI наверное плачет )
Ладно, теперь реально сложный вопрос
Кто-нибудь делал расписания в базе? Как хранить "два-через-два"

Ilia
28.04.2018
16:19:05
Логику прописывать.
никаких секретов

Al
28.04.2018
16:20:16
Логику прописывать.
нене. погоди. мы кажется нашли того мистического говнокодера который делает что то потому что ему понравилось написаное в статье а не то что реально подходит под его задачи

Dmitrii
28.04.2018
16:20:31
Просто вот например есть таблица в которой хранится расписание но в текущем виде это типа расписание на одну абстрактную неделю
И туда "два-через-два" никак не сохранить

Google

Ilia
28.04.2018
16:21:07
ОПисываешь правила типа ДВА ЧЕРЕЗ ДВА, делаешь календарь, запоняешь его на скажем год вперёд, применяешь правила, которые
к этому календарю что-то привязывают. И уже в фиксированных датах намечаешь события.

Dmitrii
28.04.2018
16:21:13
Может есть бест-практис схемы?

Ilia
28.04.2018
16:21:33
нет. ТЗ у всех разные. НЕ бывает общих

Dmitrii
28.04.2018
16:21:39
Т.е. основной посыл — заполнять на год вперед?

Ilia
28.04.2018
16:21:53
можно не на год

Dmitrii
28.04.2018
16:22:15
Эта пре-генерация довольно straightforward так сказать
Мне бы опять же без пред-заполнения

Ilia
28.04.2018
16:23:36
суть в том что у тебя будет N разных типов правил.
ТИпа как иерархия объектов в ООП,
Каждое будет там как-то находить времена вычислять и привязываеться к конкретным датам.
полиморфно на этой иерархии правил

Dmitrii
28.04.2018
16:25:26
Ну вот схему такую и сделать
Перелопачивать календать на полгода из пользовательского интерфейса это как то не оч

Ilia
28.04.2018
16:26:42
Ну как бы и по логике предметной области все эти правила они как бы декларативные.
но всё равно можно и как бы императивно всегда назначить что-то на вполне определённое время.
Короче я запарился объяснять домой хочу.

Dmitrii
28.04.2018
16:27:28
Ну вот пользователь заходит в календать и там херовина "Два-через-два"
Не буду же я добавлять в базу записей на полгода сразу )
А если он передумает? Удалять?
Тлен

Ilia
28.04.2018
16:28:05
Хочешь делай, не хочешь — думай сам.
Я такое делал раза три наверное, удобно, логично, производительно
полгода это вшивых 180 записей