子集大 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.

中阅读有关它们的信息