postgres tablefunc crosstab() 函数中的类别可以是整数吗?

Can the categories in the postgres tablefunc crosstab() function be integers?

一切尽在标题中。文档有这样的内容:

SELECT * 
FROM crosstab('...') AS ct(row_name text, category_1 text, category_2 text);

我有两个 table,lab_testslab_tests_results。所有 lab_tests_results 行都绑定到 lab_tests table 中的主键 ID 整数。我正在尝试创建一个枢轴 table,其中实验室测试(由整数标识)是行 headers,相应的结果在 table 中。我无法绕过整数处或整数附近的语法错误。

当前设置是否可行?我在文档中遗漏了什么吗?或者我是否需要执行某种内部连接来制作类别字符串?或者修改 lab_tests_results table 以使用实验室测试的文本标识符?

感谢大家的帮助。非常感谢。

编辑: 在 Dmitry 的帮助下弄明白了。他弄清楚了数据布局,但我不清楚我需要什么样的输出。我试图让枢轴 table 基于 lab_tests_results table 中的 batch_id 个数字。不得不敲定基本查询和转换数据类型。

SELECT *
 FROM crosstab('SELECT lab_tests_results.batch_id, lab_tests.test_name, lab_tests_results.test_result::FLOAT
                FROM lab_tests_results, lab_tests
                WHERE lab_tests.id=lab_tests_results.lab_test AND (lab_tests.test_name LIKE ''Test Name 1'' OR lab_tests.test_name LIKE ''Test Name 2'')
                ORDER BY 1,2'
            )   AS final_result(batch_id VARCHAR, test_name_1 FLOAT, test_name_2 FLOAT);

这提供了来自 lab_tests_results table 的枢轴 table,如下所示:

batch_id   |test_name_1 |test_name_2 
---------------------------------------
batch1     |  result1   |   <null>
batch2     |  result2   |  result3  

如果我理解正确的话,你的表格看起来像这样:

CREATE TABLE lab_tests (
  id INTEGER PRIMARY KEY,
  name VARCHAR(500)
);

CREATE TABLE lab_tests_results (
  id INTEGER PRIMARY KEY,
  lab_tests_id INTEGER REFERENCES lab_tests (id),
  result TEXT
);

你的数据看起来像这样:

INSERT INTO lab_tests (id, name) 
VALUES (1, 'test1'),
       (2, 'test2');

INSERT INTO lab_tests_results (id, lab_tests_id, result)
VALUES (1,1,'result1'),
       (2,1,'result2'),
       (3,2,'result3'),
       (4,2,'result4'),
       (5,2,'result5');

首先crosstabtablefunc的一部分,你需要启用它:

CREATE EXTENSION tablefunc;

您需要 运行 根据 this 回答每个数据库一个。

最终查询将如下所示:

SELECT *
FROM crosstab(
    'SELECT lt.name::TEXT, lt.id, ltr.result
     FROM lab_tests AS lt
     JOIN lab_tests_results ltr ON ltr.lab_tests_id = lt.id'
) AS ct(test_name text, result_1 text, result_2 text, result_3 text);

解释:
crosstab() 函数接受查询的文本,该文本应该 return 3 列; (1) 组名称列,(2) 分组列,(3) 值。环绕查询只选择 crosstab() return 的所有值并定义之后的列列表(AS 之后的部分)。首先是类别名称 (test_name),然后是值 (result_1result_2)。在我的查询中,我最多会得到 3 个结果。如果我有超过 3 个结果,那么我将看不到它们,如果我有少于 3 个结果,我将得到空值。

此查询的结果是:

test_name |result_1 |result_2 |result_3
---------------------------------------
test1     |result1  |result2  |<null>
test2     |result3  |result4  |result5