powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Хитрый FULL JOIN
9 сообщений из 9, страница 1 из 1
Хитрый FULL JOIN
    #40026288
Фотография _avz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть таблица A(id, dt timestamp, суммаА) и B (id, dt, суммаБ)

Нужно сделать full join по условию:

Код: plsql
1.
2.
  A.dt - B.dt between '01:55:00' and '02:05:00' -- т.е. близки по времени
  and суммаА = суммаБ


Цель: наглядно увидеть что сцепилось, а что нет.
Беда вот в чём. По условию одной записи в A может прицепиться более одной записи B, и наоборот.
Надо чтоб цепляло не более одной с обеих сторон. Самые близкие по дате-времени.
Чтоб следующие записи, попадающие под условие , шли с обеих сторон, как будто им не нашлось соответствия.

Понимаю, можно написать хранимку, но чую, что и запросом можно.
Причём не шибко хитрым.
У кого голова посветлей, подскажите.

PG 13, если что.
...
Рейтинг: 0 / 0
Хитрый FULL JOIN
    #40026579
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_avz,

Приведите юзабельный пример тестовых данных и желаемый результат на них...

Возможно, Вам нужно смотреть в сторону JOIN LATERAL
...
Рейтинг: 0 / 0
Хитрый FULL JOIN
    #40026664
Фотография _avz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Щукина Анна,
предельно упрощённый пример - только ид и время
В таблице A время сдвинуто на 2 часа от В
поэтому самое близкое по времени совпадение для B21 -> A12
если разница больше +-5 мин, совпадение не считается

Для A14 подошли бы и В23, и В25, но В24 самое близкое

A16 сцепилось с B26

На рисунке ошибка
A15 сцепилось бы c В27 - условие выполняется
...
Рейтинг: 0 / 0
Хитрый FULL JOIN
    #40026669
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_avz,


Почему

А15-В27
А16-В26,

А не

А15-В26
А16-В27

По какому критерию вы оптимизируете допустимые сочетания?
...
Рейтинг: 0 / 0
Хитрый FULL JOIN
    #40026673
Фотография _avz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL,

поторопился, на рисунке допустил ошибку
А15 должно сойтись с В26
А16 с В27
критерий: наибольшая близость по времени, а при условии двух одинаковых - как получится.
* близость по времени с учётом сдвига в 2 часа
...
Рейтинг: 0 / 0
Хитрый FULL JOIN
    #40026675
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_avz,

Для простоты, сразу вычитайте 2 часа из В, приведите задачу к симметричной.

Чтобы самому убедиться что хорошо сформулирован критерий совпадений:

- результат зависит от перестановки А и В?
- результат зависит от порядка сканирования А/В?
- по таблице решения (не заглядывая в условие), вы способны найти ошибки програмно?
- при каких исходных даных возможны более одного верного ответа? Какой из них выбрать за канонический?

Задачка похожа на зиппер с зубьями переменного шага. Завтра с утра подумаю.
...
Рейтинг: 0 / 0
Хитрый FULL JOIN
    #40026681
Фотография _avz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL

- результат зависит от перестановки А и В?

Скорее всего, теоретическая возможность подобрать такие данные, чтоб зависело, имеется.
Но устроит любое решение.

НеофитSQL

- результат зависит от порядка сканирования А/В?

отвечу так же.

НеофитSQL

- по таблице решения (не заглядывая в условие), вы способны найти ошибки програмно?
Затрудняюсь ответить

НеофитSQL

- при каких исходных даных возможны более одного верного ответа? Какой из них выбрать за канонический?

Как минимум, если находятся 2 записи, одинаково близкие по времени.
В этом случае любой случайный вариант - годится.
это как в запросе с order by - как выдаст сервер две записи с одинаковым полем сортировки:
id1 5 id2 5 или id2 5 id1 5 - оба варианта верны
...
Рейтинг: 0 / 0
Хитрый FULL JOIN
    #40027024
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_avz,

Я обобщил ваш вопрос в виде задачки по созданию пар в соседнем разделе, где много мозговитых личностей проводят свои будни.

Посмотрите 22246624 там уже опубликовано одно оптимальное решение.

Оптимальные решения рекурсивные, и по моей оценке, содержат экспоненциальное число операций.

Линейное по времени решение будет скорее всего напоминать сортировку слиянием в цикле,
но не будет оптимальным, лишь "примерно хорошим".

https://ru.wikipedia.org/wiki/Сортировка_слиянием
...
Рейтинг: 0 / 0
Хитрый FULL JOIN
    #40027371
Фотография _avz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL,

спасибо. Решил хранимкой.
Курсор A union B order by dt
делаю хитрый проход по курсору один раз, с забегами вперёд до 5 минут вперёд,
(для поиска соответствий)
и возвратом на необработанные.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Хитрый FULL JOIN
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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