PostgreSQL 返回和 sql 元组描述不兼容

标签 postgresql crosstab

这个查询有什么问题?我一直在用数据类型抨击我的头脑,但没有发现任何问题。

谢谢。

select * from crosstab(
$$
select * from 
(values
(1546300800, 187923, 1.5),
(1546300800, 187924, 200),
(1546300800, 187926, 120),
(1546300800, 187927, 100),
(1546387200, 187923, 1.5),
(1546387200, 187924, 250),
(1546387200, 187926, 120),
(1546387200, 187927, 125),
(1546473600, 187923, 1.5),
(1546473600, 187924, 275),
(1546473600, 187926, 120),
(1546473600, 187927, 137.5),
(1546560000, 187923, 1.75)
) as t (datetime, trace, value)
$$
)
as final_result (
        unixdatetime int, 
        trace1 double precision, 
        trace2 double precision, 
        trace3 double precision, 
        trace4 double precision
        )

最佳答案

虽然你没有提到你得到的是哪个错误,但这是让它工作的方法:

初始化模块tablefunc :

CREATE EXTENSION tablefunc;

然后,您需要注意数据类型。 PostgreSQL 可能非常挑剔,在许多情况下不会自动神奇地转换它们。在这种情况下,它们必须匹配,或者至少交叉表列类型定义必须能够完全包含交叉表函数 SQL 返回的类型。

这里有 2 个选项:

  1. 将外部类型调整为可变数字类型,例如十进制:
select * from crosstab(
$$
select * from (values
    (1546300800, 187923, 1.5),
    (1546300800, 187924, 200),
    (1546300800, 187926, 120),
    (1546300800, 187927, 100),
    (1546387200, 187923, 1.5),
    (1546387200, 187924, 250),
    (1546387200, 187926, 120),
    (1546387200, 187927, 125),
    (1546473600, 187923, 1.5),
    (1546473600, 187924, 275),
    (1546473600, 187926, 120),
    (1546473600, 187927, 137.5),
    (1546560000, 187923, 1.75)
) as t (datetime, trace, value)
$$
) as final_result (
    unixdatetime int, 
    trace1 decimal,
    trace2 decimal,
    trace3 decimal,
    trace4 decimal
);
  1. 或者,确保交叉表 SQL 显式返回所需的类型,例如:
select * from crosstab(
$$
select * from (values
    (1546300800, 187923, 1.5::double precision),
    (1546300800, 187924, 200::double precision),
    (1546300800, 187926, 120::double precision),
    (1546300800, 187927, 100::double precision),
    (1546387200, 187923, 1.5::double precision),
    (1546387200, 187924, 250::double precision),
    (1546387200, 187926, 120::double precision),
    (1546387200, 187927, 125::double precision),
    (1546473600, 187923, 1.5::double precision),
    (1546473600, 187924, 275::double precision),
    (1546473600, 187926, 120::double precision),
    (1546473600, 187927, 137.5::double precision),
    (1546560000, 187923, 1.75::double precision)
) as t (datetime, trace, value)
$$
) as final_result (
    unixdatetime int, 
    trace1 double precision,
    trace2 double precision,
    trace3 double precision,
    trace4 double precision
);

两种情况下的结果如下所示:

 unixdatetime | trace1 | trace2 | trace3 | trace4 
--------------+--------+--------+--------+--------
   1546300800 |    1.5 |    200 |    120 |    100
   1546387200 |    1.5 |    250 |    120 |    125
   1546473600 |    1.5 |    275 |    120 |  137.5
   1546560000 |   1.75 |        |        |       
(4 rows)

关于PostgreSQL 返回和 sql 元组描述不兼容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55285661/

相关文章:

sql - 跟踪表中的更改

python - 如何将一列的值与数据框中的另一列匹配

function - Postgresql:将输入键/值对转储到 PL/pgSQL 中的字符串变量中

sql - 如何将表列转换为Sql server 表中的垂直数据?

r - 使用 table() 生成数据框的更好方法

sql - 批量插入表时优化索引更新速度

sql - 使用参数调用函数或 View

sql - 需要帮助 postgresql 交叉表查询

sql - 交叉表查询提供了意外的结果

sql - PostgreSQL交叉表语法错误: No function matches the given name and argument types. You might need to add explicit type casts