postgresql交叉表简单的例子

时间:2018-03-01 14:34:01

标签: postgresql crosstab

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

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

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

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

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

您能告诉我该怎么做并解释它的工作原理吗?

1 个答案:

答案 0 :(得分:7)

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

CREATE EXTENSION tablefunc;

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

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

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

现在让我们准备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);

结果:

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

如何运作#1

无论如何理解它是如何工作的,我发现只更改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     |

当我们更改了键的排序时,crosstab函数会看到键在另一个方向上排序,从而反转生成的列。

如何运作#2

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

SELECT *
FROM crosstab(
    'SELECT *
     FROM example
     ORDER BY id ASC, key ASC;'
) AS ct(blablafirst INT, blablasecond TEXT, blablathird TEXT);

结果

|_blablafirst__|_blablasecond_|_blablathird_|
| 123          | Doe          | John        |