Где ошибка?
SELECT *
FROM members m1
JOIN members m2 ON m1.original_id < m2.original_id
WHERE m1.dt_reg <> m2.dt_reg AND ABS(EXTRACT(EPOCH FROM m1.dt_reg - m2.dt_reg)) <= 300
ORDER BY m1.dt_reg;
Было бы скорее странно, если бы их не было — у Вас же соединение не по равенству. Сколько записей возвращает условие: SELECT * FROM members m1 JOIN members m2 ON m1.original_id < m2.original_id например? Ну и потом отфильтровываются не все "дубликаты", вот и всё.
Сожрало 64гб памяти пришлось убивать процес )
А где тут дубликаты то????
original_id = 10 - этого человека может быть N количество раз.
Тогда почему оператор <
Эээ... это был намёк (и мне начинает казаться, что Вы не понимаете, как работают (что значат) JOIN-ы логически). ;) И намёк был на следующее: если в таблице x, к примеру, 5 записей, сколько их будет в результате SELECT * FROM x JOIN x AS x1 ON true?
Жоска) нафига клеить таблицу с собой по совпадению айди?
Это же cross join надо писать без true
Нужно было быстро и без боли. Но походу надо будет снова чето учить. Т_Т SELECT DISTINCT ON (original_id) * FROM members WHERE время dt_reg по сравнению с другими записями не больше 5минут ORDER BY dt_reg; Что тут нужно гуглить? join или WITH ordered_members AS, или подзапросы? куда рыть? 🙇🏻♂️
Lag lead оконные потом выбрать
Создайте индекс по original_id
> Но походу надо будет снова чето учить. Т_Т Лучше бы основы выучить, да (так-то можно "сдирать" идиомы без понимания смысла в любом языке, и, пока везёт, так и жить... но когда-то и не прокатит, как в этом случае). ;) Вот это: SELECT DISTINCT ON (original_id) * почти наверняка не нужно (если original_id — уникальный ключ). > Что тут нужно гуглить? EXISTS, скорее всего (я не уверен, что правильно понял задачу — лучше бы подробнее её описать).
по сравнению с другими записями не больше 5минут относительно чего?
Судя по всему записей с тем же original_id ))) lag коллеге в помощь
Есть база клиентов с привязкой на какой-то space. original_id не является уникальным ключом. С точки зрения программирования я бы решил задачу так. 1. Запросил бы у базы только 1 экземпляр клиента. SELECT DISTINCT ON (original_id) original_id, dt_reg FROM members ORDER BY original_id; 2. Отсортировал полученное по dt_reg 3. Прошелся бы по каждой записи dt_reg и складывал бы массив с массивами.
Куда-то разница во времени пропала )
Разница во времени 5минут. enumerate бы заюзал и просто i+1 бы добавлял. Просто может SQL бы мог это сделать.
With x as (Select Id, original_id, dreg, lag(dreg) over (partition by original_id order by dreg, I’d) Select from x where
WITH cte AS ( SELECT id, original_id, dt_reg, LAG(dt_reg) OVER (PARTITION BY original_id ORDER BY dt_reg) - dt_reg as intervals FROM members ) SELECT * FROM cte WHERE intervals IS NULL OR intervals <= INTERVAL '5 minutes'; Почему не попадает прошлый?
И показывайте все а не две колонки
И надо >
Хотя я уже запутался в вариантах запроса проверьте сами.
Обсуждают сегодня