Слияние двух отсортированных результатов с перерывами один на два - PullRequest
0 голосов
/ 26 сентября 2018

Какой способ я могу использовать для слияния двух отсортированных результатов.

Пример:

SELECT * FROM (VALUES (1),(2),(3),(4)) AS X(a);
┌───┐
│ a │
├───┤
│ 1 │
│ 2 │
│ 3 │
│ 4 │
└───┘
(4 rows)

И

SELECT * FROM (VALUES ('A'),('B'),('C'),('D')) AS X(a);
┌───┐
│ a │
├───┤
│ A │
│ B │
│ C │
│ D │
└───┘
(4 rows)

И результат

┌───┐
│ a │
├───┤
│ A │
│ 1 │
│ B │
│ 2 │
│ C │
│ 3 │
│ D │
│ 4 │
└───┘
(4 rows)

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

Спасибо за ваш совет.

Ответы [ 3 ]

0 голосов
/ 26 сентября 2018

Что ж, это можно сделать с помощью ROW_NUMBER, но зачем вам это нужно?

select a
from 
 (
   SELECT a, 2 as flag, row_number() over (order by a) as rn 
   FROM (VALUES (1),(2),(3),(4)) AS X(a)
   union all
   SELECT a, 1 as flag, row_number() over (order by a) as rn
   FROM (VALUES ('A'),('B'),('C'),('D')) AS X(a)
 ) as dt
order by rn, flag

Конечно, вам нужно сопоставить типы данных в обоих выборках.

0 голосов
/ 26 сентября 2018

с cte (a, RowsNumber) как (ВЫБРАТЬ КОНВЕРТ (varchar (120), a) [a], ROW_NUMBER () более (упорядочить по a) [RowsNumber] FROM (VALUES (1), (2), (3), (4)) AS X (a) объединяет все SELECT a, ROW_NUMBER () через (порядок по a) [RowsNumber] FROM (VALUES ('A'), ('B'), ('C'),('D')) AS X (a)) Выберите из списка по RowsNumber

0 голосов
/ 26 сентября 2018

demo: db <> fiddle

select a from (
    SELECT a::text, row_number() OVER() as rowcount, 2 as sort_table 
    FROM (VALUES (1),(2),(3),(4)) AS X(a)

    UNION ALL

    SELECT a::text, row_number() OVER(), 1 
    FROM (VALUES ('A'),('B'),('C'),('D')) AS X(a)
) s

ORDER BY 
    rowcount, sort_table

Вам нужно добавить некоторые метаданные, чтобы найти правильный порядок сортировки.Сначала я добавил оконную функцию row_number() (https://www.postgresql.org/docs/current/static/tutorial-window.html) в обе таблицы. Это добавляет уникальный номер строки на строку. Так что это работает как столбец первого порядка. Теперь я могу упорядочить по номеру строки:первые строки всех таблиц, за которыми следуют вторые строки таблиц, ... Теперь у вас есть две «первые» строки в вашем результате, которые необходимо упорядочить. Если вы хотите строки второй таблицы, вы можете достичь этого с помощью константызначение. Я назвал его sort_table.

...