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_tests
和 lab_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');
首先crosstab
是tablefunc
的一部分,你需要启用它:
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_1
、result_2
)。在我的查询中,我最多会得到 3 个结果。如果我有超过 3 个结果,那么我将看不到它们,如果我有少于 3 个结果,我将得到空值。
此查询的结果是:
test_name |result_1 |result_2 |result_3
---------------------------------------
test1 |result1 |result2 |<null>
test2 |result3 |result4 |result5
一切尽在标题中。文档有这样的内容:
SELECT *
FROM crosstab('...') AS ct(row_name text, category_1 text, category_2 text);
我有两个 table,lab_tests
和 lab_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');
首先crosstab
是tablefunc
的一部分,你需要启用它:
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_1
、result_2
)。在我的查询中,我最多会得到 3 个结果。如果我有超过 3 个结果,那么我将看不到它们,如果我有少于 3 个结果,我将得到空值。
此查询的结果是:
test_name |result_1 |result_2 |result_3
---------------------------------------
test1 |result1 |result2 |<null>
test2 |result3 |result4 |result5