间歇性地合并两个排序的结果
Merge two sorted results with intermittently of one on two
我可以使用哪种方式合并两个排序结果。
示例:
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)
我尝试了一些解决方案,为每个结果创建一个带有模数的新临时列,但我阻止了合并,我不确定是否真的有效。
感谢您的建议。
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()
window 函数 (https://www.postgresql.org/docs/current/static/tutorial-window.html) 添加到两个 table 中。这会为每行添加一个唯一的行号。所以这作为一阶列。现在我可以按行号排序:首先是所有 table 的第一行,然后是 table 的第二行,......现在你有两个 "first" 行在你的结果中必须订购。如果你想要第二个 table 的行,你可以通过一个常量值来实现。我把它命名为sort_table
.
好吧,可以使用 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
当然,您需要在两个 Select 中匹配数据类型。
用 cte(a, RowsNumber) 作为 (
SELECT CONVERT(varchar(120), a) [a], ROW_NUMBER() over(order by a) [RowsNumber] FROM (VALUES (1),(2),(3),( 4)) AS X(a) 联合所有
SELECT a, ROW_NUMBER() over(order by a) [RowsNumber] FROM (VALUES ('A'),('B'),('C'), ('D')) AS X(a)) Select a from cte order by RowsNumber
我可以使用哪种方式合并两个排序结果。
示例:
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)
我尝试了一些解决方案,为每个结果创建一个带有模数的新临时列,但我阻止了合并,我不确定是否真的有效。
感谢您的建议。
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()
window 函数 (https://www.postgresql.org/docs/current/static/tutorial-window.html) 添加到两个 table 中。这会为每行添加一个唯一的行号。所以这作为一阶列。现在我可以按行号排序:首先是所有 table 的第一行,然后是 table 的第二行,......现在你有两个 "first" 行在你的结果中必须订购。如果你想要第二个 table 的行,你可以通过一个常量值来实现。我把它命名为sort_table
.
好吧,可以使用 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
当然,您需要在两个 Select 中匹配数据类型。
用 cte(a, RowsNumber) 作为 ( SELECT CONVERT(varchar(120), a) [a], ROW_NUMBER() over(order by a) [RowsNumber] FROM (VALUES (1),(2),(3),( 4)) AS X(a) 联合所有 SELECT a, ROW_NUMBER() over(order by a) [RowsNumber] FROM (VALUES ('A'),('B'),('C'), ('D')) AS X(a)) Select a from cte order by RowsNumber