|
Хитрый FULL JOIN
|
|||
---|---|---|---|
#18+
Есть таблица A(id, dt timestamp, суммаА) и B (id, dt, суммаБ) Нужно сделать full join по условию: Код: plsql 1. 2.
Цель: наглядно увидеть что сцепилось, а что нет. Беда вот в чём. По условию одной записи в A может прицепиться более одной записи B, и наоборот. Надо чтоб цепляло не более одной с обеих сторон. Самые близкие по дате-времени. Чтоб следующие записи, попадающие под условие , шли с обеих сторон, как будто им не нашлось соответствия. Понимаю, можно написать хранимку, но чую, что и запросом можно. Причём не шибко хитрым. У кого голова посветлей, подскажите. PG 13, если что. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2020, 11:22 |
|
Хитрый FULL JOIN
|
|||
---|---|---|---|
#18+
_avz, Приведите юзабельный пример тестовых данных и желаемый результат на них... Возможно, Вам нужно смотреть в сторону JOIN LATERAL ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2020, 20:08 |
|
Хитрый FULL JOIN
|
|||
---|---|---|---|
#18+
Щукина Анна, предельно упрощённый пример - только ид и время В таблице A время сдвинуто на 2 часа от В поэтому самое близкое по времени совпадение для B21 -> A12 если разница больше +-5 мин, совпадение не считается Для A14 подошли бы и В23, и В25, но В24 самое близкое A16 сцепилось с B26 На рисунке ошибка A15 сцепилось бы c В27 - условие выполняется ... |
|||
:
Нравится:
Не нравится:
|
|||
11.12.2020, 07:19 |
|
Хитрый FULL JOIN
|
|||
---|---|---|---|
#18+
_avz, Почему А15-В27 А16-В26, А не А15-В26 А16-В27 По какому критерию вы оптимизируете допустимые сочетания? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.12.2020, 08:01 |
|
Хитрый FULL JOIN
|
|||
---|---|---|---|
#18+
НеофитSQL, поторопился, на рисунке допустил ошибку А15 должно сойтись с В26 А16 с В27 критерий: наибольшая близость по времени, а при условии двух одинаковых - как получится. * близость по времени с учётом сдвига в 2 часа ... |
|||
:
Нравится:
Не нравится:
|
|||
11.12.2020, 08:13 |
|
Хитрый FULL JOIN
|
|||
---|---|---|---|
#18+
_avz, Для простоты, сразу вычитайте 2 часа из В, приведите задачу к симметричной. Чтобы самому убедиться что хорошо сформулирован критерий совпадений: - результат зависит от перестановки А и В? - результат зависит от порядка сканирования А/В? - по таблице решения (не заглядывая в условие), вы способны найти ошибки програмно? - при каких исходных даных возможны более одного верного ответа? Какой из них выбрать за канонический? Задачка похожа на зиппер с зубьями переменного шага. Завтра с утра подумаю. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.12.2020, 08:22 |
|
Хитрый FULL JOIN
|
|||
---|---|---|---|
#18+
НеофитSQL - результат зависит от перестановки А и В? Скорее всего, теоретическая возможность подобрать такие данные, чтоб зависело, имеется. Но устроит любое решение. НеофитSQL - результат зависит от порядка сканирования А/В? отвечу так же. НеофитSQL - по таблице решения (не заглядывая в условие), вы способны найти ошибки програмно? НеофитSQL - при каких исходных даных возможны более одного верного ответа? Какой из них выбрать за канонический? Как минимум, если находятся 2 записи, одинаково близкие по времени. В этом случае любой случайный вариант - годится. это как в запросе с order by - как выдаст сервер две записи с одинаковым полем сортировки: id1 5 id2 5 или id2 5 id1 5 - оба варианта верны ... |
|||
:
Нравится:
Не нравится:
|
|||
11.12.2020, 08:33 |
|
Хитрый FULL JOIN
|
|||
---|---|---|---|
#18+
_avz, Я обобщил ваш вопрос в виде задачки по созданию пар в соседнем разделе, где много мозговитых личностей проводят свои будни. Посмотрите 22246624 там уже опубликовано одно оптимальное решение. Оптимальные решения рекурсивные, и по моей оценке, содержат экспоненциальное число операций. Линейное по времени решение будет скорее всего напоминать сортировку слиянием в цикле, но не будет оптимальным, лишь "примерно хорошим". https://ru.wikipedia.org/wiki/Сортировка_слиянием ... |
|||
:
Нравится:
Не нравится:
|
|||
11.12.2020, 20:06 |
|
|
start [/forum/topic.php?fid=53&fpage=19&tid=1994318]: |
0ms |
get settings: |
10ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
45ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
43ms |
get tp. blocked users: |
1ms |
others: | 12ms |
total: | 142ms |
0 / 0 |