Гость
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / горизонтальное объединение таблиц (по столбцам) без JOIN / 9 сообщений из 9, страница 1 из 1
14.06.2019, 10:02
    #39826438
Толикman
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
горизонтальное объединение таблиц (по столбцам) без JOIN
Доброго дня!

Не могу найти простое решение простой задачи.

Есть 2 запроса:
Код: plsql
1.
2.
3.
WITH t1(A) AS (SELECT A FROM (VALUES (1), (2)) ta)
WITH t1(B) AS (SELECT B FROM (VALUES (10), (20)) tb)
SELECT ... ЧТО ЗДЕСЬ НАПИСАТЬ?) ...


Нужно из них получить таблицу:
Код: plsql
1.
2.
3.
A    B
1    10 
2    20



Как это сделать самым быстрым способом?
Вариант с Row_Number() очень долгий - в реальном запросе 5 млн строк.
...
Рейтинг: 0 / 0
14.06.2019, 10:09
    #39826442
Щукина Анна
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
горизонтальное объединение таблиц (по столбцам) без JOIN
Толикman,

а если кол-во строк, возвращаемое "подзапросами", будет разное? К примеру - один вернул три строки, другой - десять
...
Рейтинг: 0 / 0
14.06.2019, 12:36
    #39826543
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
горизонтальное объединение таблиц (по столбцам) без JOIN
ТоликmanДоброго дня!

Не могу найти простое решение простой задачи.

Есть 2 запроса:
Код: plsql
1.
2.
3.
WITH t1(A) AS (SELECT A FROM (VALUES (1), (2)) ta)
WITH t1(B) AS (SELECT B FROM (VALUES (10), (20)) tb)
SELECT ... ЧТО ЗДЕСЬ НАПИСАТЬ?) ...


Нужно из них получить таблицу:
Код: plsql
1.
2.
3.
A    B
1    10 
2    20



Как это сделать самым быстрым способом?
Вариант с Row_Number() очень долгий - в реальном запросе 5 млн строк.

Это не простая задача а что то очень кривое. В реальности таких задач не бывает.
Что значит по столбцам? Порядок результатов без order by в запросах не специфицирован и может считаться условно случайным.
Как вы это обьединять собираетесь?
Ну и как вам уже написали а если количество строк разное?
...
Рейтинг: 0 / 0
15.06.2019, 09:34
    #39826801
Толикman
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
горизонтальное объединение таблиц (по столбцам) без JOIN
Это не кривая задача, и она реально есть, вот сейчас.
Запросы гарантировано возвращают отсортированные наборы данных одинакового размера, пример выше упрощён.
Сейчас есть join, но происходит он по row_number(), который не индексирован, поэтому долго.
Создать таблицы возможности нет.
...
Рейтинг: 0 / 0
15.06.2019, 10:41
    #39826805
qwwq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
горизонтальное объединение таблиц (по столбцам) без JOIN
Толикman,

откройте 2 курсора и фетчите в перемежку по одной записи . прямо с клиента.


просто задача не "для sql" -- который больше язык работы с множествами, чем с курсорами и прочими предупорядоченными паковками.

хотя если бы у вас было 2 массива, то unnest(array1,array2) решал бы вашу задачу в пж.
...
Рейтинг: 0 / 0
15.06.2019, 12:49
    #39826815
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
горизонтальное объединение таблиц (по столбцам) без JOIN
qwwqТоликman,

откройте 2 курсора и фетчите в перемежку по одной записи . прямо с клиента.


просто задача не "для sql" -- который больше язык работы с множествами, чем с курсорами и прочими предупорядоченными паковками.

хотя если бы у вас было 2 массива, то unnest(array1,array2) решал бы вашу задачу в пж.

Если уж пошла такая пьянка то конечно да вышеописанный пример через пару unnest решается
(с использованием слабодокументированных фиче-багов):

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
WITH М 
ta AS (SELECT * FROM (VALUES (1), (2)) ta),
tb AS (SELECT * FROM (VALUES (10), (20)) tb)
SELECT unnest(array(select * from ta)), unnest(array(select * from tb));
 unnest | unnest 
--------+--------
      1 |     10
      2 |     20



но какая будет скорость на 5М строк - у меня уверенности нет.

Но вообще вы бы полный пример бы привели может там всетаки не надо сначала 2 упорядоченных набора создавать а потом думать как склеить а сразу нужный итог получиь можно?
...
Рейтинг: 0 / 0
16.06.2019, 20:16
    #39827001
Толикman
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
горизонтальное объединение таблиц (по столбцам) без JOIN
Maxim BogukНо вообще вы бы полный пример бы привели может там всетаки не надо сначала 2 упорядоченных набора создавать а потом думать как склеить а сразу нужный итог получиь можно?

Глобальные граничения - нельзя создавать таблицы, даже временные. Т.е. в нашем распоряжении только SELECT.
Клиент - MS SSAS Tabular 2017, он может только выполнить запрос.
Источник Greenplum (postgresql)

Условия:
1. есть 2 таблицы с событиями, одно закрывает сервис, второе создает сервис.
2. отчетный период закрывается 15 числа месяца, следующего за отчетным.
Задача: надо связать два события - закрытие старого сервиса и открытие нового в диапазоне от начала отчетного периода, до даты его закрытия.

Из задачи вытекает одна проблема, отчетные периоды пересекаются, в связи с этим событие, произошедшее в первой половине месяца может быть связано как с предидущем отчетным периодом, так ис текущим. В связи с этим надо однозначно перевязать события. Сложность в том, что одного из событий может не существовать, поэтому просто их пронумероать и связать тоже нельзя.

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

Код: sql
1.
2.
3.
4.
5.
CREATE TABLE t_ab (a integer UNIQUE, b integer UNIQUE);
INSERT INTO t_AB(a, b)
SELECT ta.a, tb.b
FROM ta JOIN tb ON (ta.u_id = tb.u_id) AND ((ta.month = tb.month) OR ((ta.day < 15) AND (ta.month - 1 = tb.month)) OR ((tb.day < 15) AND (ta.month + 1 = tb.month)))
ORDER BY ta.a, tb.b;



Таблицы создавать нельзя, поэтому я решил после первого джойна пройтись оконной функцией поиска максимального айдишника каждого события MAX(A) OVER () AS max_a, MAX(B) OVER () AS max_b, выкинуть первую строку, и .

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
WITH t_ab AS (
    SELECT ta.a, tb.b
    FROM ta JOIN tb ON (ta.u_id = tb.u_id) AND ((ta.month = tb.month) OR ((ta.day < 15) AND (ta.month - 1 = tb.month)) OR ((tb.day < 15) AND (ta.month + 1 = tb.month)))
    ORDER BY ta.a, tb.b),

WITH max_ids AS (
    SELECT * FROM (VALUES (0, 0)) t(max_a, max_b)
    UNION ALL
    SELECT MAX(A) OVER (RANGE UNBOUNDED PRECEDING) AS max_a, MAX(B) OVER (RANGE UNBOUNDED PRECEDING) AS max_b
    FROM t_ab
)

-- Вот здесь я хочу парралельно пробежаться по двум запросам:
SELECT unnest(array(select * from t_ab UNION ALL select * from (VALUES (0,0) t(a, b)))), unnest(array(select * from max_ids))
WHERE a>max_a, b>max_b



Но да, пока писал текст и вспоминал оконные функции, нашел логично более оптимальный вариант:
Код: sql
1.
2.
3.
4.
5.
6.
-- month и day - для упрощения
SELECT ta.a, tb.b
FROM ta JOIN tb ON (ta.u_id = tb.u_id) AND ((ta.month = tb.month) OR ((ta.day < 15) AND (ta.month - 1 = tb.month)) OR ((tb.day < 15) AND (ta.month + 1 = tb.month)))
WHERE ta.a > MAX(A) OVER w, tb.b > MAX(B) OVER w -- так мы убеждаемся, что ни одно из событий ранее не было выведено запросом
ORDER BY ta.a, tb.b
WINDOW w AS (ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING)



Спасибо всем!
...
Рейтинг: 0 / 0
23.06.2019, 00:28
    #39829521
Толикman
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
горизонтальное объединение таблиц (по столбцам) без JOIN
Я ошибся, тест показал несостоятельность запроса:
Из талице ниже он вернул:
Код: sql
1.
2.
drop_id	make_id
1	1



В общем как из этой таблицы:
Код: sql
1.
2.
3.
4.
5.
drop_id	make_id
1	1
2	1
1	3
2	3



Оставить строки:
Код: sql
1.
2.
3.
drop_id	make_id
1	1
2	3



Есть возможность выполнить только SELECT.
...
Рейтинг: 0 / 0
24.06.2019, 12:54
    #39829788
Ivan Durak
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
горизонтальное объединение таблиц (по столбцам) без JOIN
все равно витрина в гринпламе будет нужна.
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / горизонтальное объединение таблиц (по столбцам) без JOIN / 9 сообщений из 9, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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