Postgres Crosstab выдает ошибку о кортеже, но возвращаемые столбцы соответствуют типу? - PullRequest
0 голосов
/ 13 января 2019

Я получаю эту ошибку, но типы совпадают, как я проверял с помощью pg_typeof для столбцов. Они вернули текст и bigint.

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
)

А вот и вставки

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);

И запрос, который возвращает ошибку. Я ищу в Google и StackOverflow, и я в тупике.

// Show new current events.
select * from crosstab(        
 'select b.reader_name, b.metric_key, a.metric_value
    from
       (select max(reader_event_id) as reader_event_id
             , reader_name
             , metric_key
             , max(event_date) as event_date 
                 from reader_event
                    group by reader_name,metric_key
                      order by 2, 3, 4
       ) b
       inner join reader_event a 
           on a.reader_event_id = b.reader_event_id
            order by 1,2'
       ) AS (reader_name text,metric_key text,metric_value bigint)

Есть идеи, почему я получаю ошибку?

Спасибо.

1 Ответ

0 голосов
/ 13 января 2019

Возможно, вы не поняли смысл crosstab.
(reader_name text,metric_key text,metric_value bigint) является входом кросс-таблицы. Это определяется как:

  1. имя строки (возвращается в 1-м столбце кросс-таблицы)
  2. название категории (не возвращается, но используется для заказа категорий)
  3. значение категории (возвращается начиная со 2-го столбца кросс-таблицы)

Ожидается, что вы укажете вывод, который в вашем случае:
(reader_name text,metric_value1 bigint,metric_value2 bigint,metric_value3 bigint)

Если вы не добавите предложение WHERE, чтобы внутренний запрос возвращал не более N значений, вам нужно будет добавить больше значений по мере роста базы данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...