子集大 table 用于多个 UNION
Subset large table for use in multiple UNIONs
假设我有一个具有以下结构的 table:
id measure_1_actual measure_1_predicted measure_2_actual measure_2_predicted
1 1 0 0 0
2 1 1 1 1
3 . . 0 0
我想为每个 ID 创建以下 table(显示的是 id = 1
的示例):
measure actual predicted
1 1 0
2 0 0
这是我可以解决这个问题的一种方法(我还没有测试过这个,但我希望你能理解大致的想法):
SELECT 1 AS measure,
measure_1_actual AS actual,
measure_1_predicted AS predicted
FROM tb
WHERE id = 1
UNION
SELECT 2 AS measure,
measure_2_actual AS actual,
measure_2_predicted AS predicted
FROM tb WHERE id = 1
实际上,我有五个这样的人 "measures" 和数千万人 - 为每个成员将如此大的 table 子集五次似乎不是最有效的方法。这是一个实时 API,每分钟接收数十个请求,因此我认为我需要一种更好的方法来执行此操作。我的另一个想法是,一旦收到请求,可能会为每个成员创建一个临时 table/view,然后基于该子集 table.
创建 UNION
有人有更有效的方法吗?
您可以使用横向连接:
select t.id, v.*
from t cross join lateral
(values (1, measure_1_actual, measure_1_predicted),
(2, measure_2_actual, measure_2_predicted)
) v(measure, actual, predicted);
横向连接是在 Postgres 9.4 中引入的。您可以在 documentation.
中阅读有关它们的信息
假设我有一个具有以下结构的 table:
id measure_1_actual measure_1_predicted measure_2_actual measure_2_predicted
1 1 0 0 0
2 1 1 1 1
3 . . 0 0
我想为每个 ID 创建以下 table(显示的是 id = 1
的示例):
measure actual predicted
1 1 0
2 0 0
这是我可以解决这个问题的一种方法(我还没有测试过这个,但我希望你能理解大致的想法):
SELECT 1 AS measure,
measure_1_actual AS actual,
measure_1_predicted AS predicted
FROM tb
WHERE id = 1
UNION
SELECT 2 AS measure,
measure_2_actual AS actual,
measure_2_predicted AS predicted
FROM tb WHERE id = 1
实际上,我有五个这样的人 "measures" 和数千万人 - 为每个成员将如此大的 table 子集五次似乎不是最有效的方法。这是一个实时 API,每分钟接收数十个请求,因此我认为我需要一种更好的方法来执行此操作。我的另一个想法是,一旦收到请求,可能会为每个成员创建一个临时 table/view,然后基于该子集 table.
创建 UNION有人有更有效的方法吗?
您可以使用横向连接:
select t.id, v.*
from t cross join lateral
(values (1, measure_1_actual, measure_1_predicted),
(2, measure_2_actual, measure_2_predicted)
) v(measure, actual, predicted);
横向连接是在 Postgres 9.4 中引入的。您可以在 documentation.
中阅读有关它们的信息