关于元组的Postgres Crosstab抛出错误,但返回列匹配类型?

时间:2019-01-13 05:52:09

标签: postgresql crosstab

我不断收到此错误,但是类型与我用pg_typeof检查列的匹配。他们返回了文字和bigint。

build

这是测试表的定义

ERROR: return and sql tuple descriptions are incompatible
SQL state: 42601

这是插入物

create table reader_event
(
   reader_event_id serial,
   reader_name text,
   event_type varchar(25),
   event_date timestamp,
   metric_key text,
   metric_value bigint
)

返回错误的查询。我搜索google和StackOverflow并感到困惑。

insert into reader_event(reader_name, event_type, event_date, metric_key, metric_value)
 values('t', 'insert', now(),                    'followers',    10),
       ('t', 'upate', now()+ interval '1' day,   'followers',    20),
       -- Add New Metric
       ('t', 'insert', now(),                    'subscribers',  10000),
       ('t', 'update', now()+ interval '2' day,  'followers',    9999),
       ('t', 'update', now()+ interval '3' day,  'subscribers',  17),
       -- Add new metric
       ('t', 'insert', now(),                    'reads',        9999);

 insert into reader_event(reader_name, event_type, event_date, metric_key, metric_value)
  values('a', 'insert', now(),                   'followers',    10),
        ('a', 'upate',  now(),                   'followers',    20),
        ('a', 'upate',  now()+ interval '1' day, 'followers',    230);

关于我为什么会收到错误的任何想法?

谢谢。

1 个答案:

答案 0 :(得分:0)

您可能不了解crosstab的要点。
(reader_name text,metric_key text,metric_value bigint)是交叉表的输入。是通过以下方式定义的吗?

  1. 行名(在交叉表的第一列中返回)
  2. 类别名称(未返回,但用于排序类别)
  3. 类别值(从交叉表的第二列开始返回)

您需要指定输出,具体情况如下:
(reader_name text,metric_value1 bigint,metric_value2 bigint,metric_value3 bigint)

除非添加一个WHERE子句以确保内部查询返回的值不超过N个,否则随着数据库的增长,将需要添加更多的值。