postgresql交叉表简单的例子

问题描述 投票:3回答:1

我得到了一个基于键值的表,其中每个键值对分配给一个由id标识的实体:

|_id__|_key_______|_value_|
| 123 | FIRSTNAME | John  |
| 123 | LASTNAME  | Doe   |

我想把它变成这样的结构:

|_id__|_firstName_|_lastName_|
| 123 | John      | Doe      |

我想可以使用crosstab函数中的postgres构建来完成它。

你能告诉我怎么做并解释它为什么有效吗?

postgresql crosstab
1个回答
6
投票

首先激活tablefunc扩展中的构建:

CREATE EXTENSION tablefunc;

然后创建表并添加样本数据:

CREATE TABLE example (
  id int,
  key text,
  value text
);

INSERT INTO example VALUES
  (123, 'firstName', 'John'),
  (123, 'lastName', 'Doe');

现在让我们准备一下qazxsw poi声明:

crosstab

在这里拥有SELECT * FROM example ORDER BY id ASC, key ASC; 很重要。

结果:

ORDER BY

现在|_id__|_key_______|_value_| | 123 | FIRSTNAME | John | | 123 | LASTNAME | Doe | 创建我们想要的表:

crosstab

结果:

SELECT *
FROM crosstab(
    'SELECT *
     FROM example
     ORDER BY id ASC, key ASC;'
) AS ct(id INT, firstname TEXT, lastname TEXT);

它是如何工作的#1

然而,要了解它是如何工作的,我发现最简单的方法是更改​​|_id__|_firstName_|_lastName_| | 123 | John | Doe | 并查看会发生什么:

ORDER BY

结果:

SELECT *
FROM crosstab(
    'SELECT *
     FROM example
     ORDER BY id ASC, key DESC;'
) AS ct(id INT, firstname TEXT, lastname TEXT);

当我们改变键的排序时,|_id__|_firstName_|_lastName_| | 123 | Doe | John | 函数看到键在另一个方向上排序,从而反转生成的列。


工作原理#2

另一件事让我理解它是如何工作的:列定义是关于位置的:

crosstab

结果

SELECT *
FROM crosstab(
    'SELECT *
     FROM example
     ORDER BY id ASC, key ASC;'
) AS ct(blablafirst INT, blablasecond TEXT, blablathird TEXT);
© www.soinside.com 2019 - 2024. All rights reserved.