PostgreSQL возвращают и описания кортежа sql несовместимы - PullRequest
0 голосов
/ 21 марта 2019

Что не так с этим запросом?Я ударился головой о типе данных, но не увидел никаких проблем.

Спасибо.

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
        )

Ответы [ 2 ]

1 голос
/ 22 марта 2019

Спасибо, ребята, за помощь!Решение Ancoron сработало идеально.

Что касается 2-го решения, вместо явного приведения каждого значения в каждой строке с двойной точностью, мы можем применить приведение типа к имени столбца, как показано в коде ниже:

select * from crosstab(
$$
select datetime, trace, value::double precision 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
        )
1 голос
/ 21 марта 2019

Хотя вы не упомянули, какую ошибку вы получаете, вот как заставить ее работать:

Инициализируйте модуль tablefunc:

CREATE EXTENSION tablefunc;

Затем вы должны быть осторожны с типами данных.PostgreSQL может быть довольно требователен и во многих случаях не может автоматически конвертировать их.В этом случае они должны совпадать или, по крайней мере, определения типов столбцов кросс-таблицы должны полностью содержать типы, возвращаемые функцией кросс-таблицы SQL.

У вас есть 2 варианта:

  1. Адаптируйте внешний тип к переменному числовому типу, например decimal:
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
);
В качестве альтернативы, убедитесь, что кросс-таблица 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...