PostgreSQL: SELECT INTO меняет тип данных поля - PullRequest
0 голосов
/ 27 августа 2018

У меня есть следующая таблица:

CREATE TABLE IF NOT EXISTS foo_raw
(
    time   TIMESTAMPTZ NOT NULL,
    volume INTEGER,                  <-- note source field is of type integer
    price  DOUBLE PRECISION
);

Я заполняю его из файла CSV:

COPY foo_raw(time,volume,price) FROM 'raw_data.csv' DELIMITER ',' CSV

Затем я создаю SELECT INTO новую таблицу, в которой объединяю дублирующиеся строки time в общий объем и средневзвешенную по объему цену.

SELECT INTO:

SELECT
    time, 
    SUM(volume)::integer AS volume,          <-- note typecast to integer here
    SUM(volume * price) / SUM(volume) AS price
INTO
    foo
FROM
    foo_raw
GROUP BY
    time
ORDER BY
    time;

Если я опишу свою новую таблицу, я увижу, что поле volume имеет тип numeric, а не integer.

pg=# \d foo
                   Table "public.foo"
 Column |           Type           | Collation | Nullable | Default 
--------+--------------------------+-----------+----------+---------
 time   | timestamp with time zone |           | not null | 
 volume | numeric                  |           |          |     
 price  | double precision         |           |          | 

Приведение типов:

Вы заметите выше в моем SELECT INTO утверждении, что я пытался типизировать результат SUM(volume) в целое число, но это тоже не работает.

Вопрос

Как заставить поле иметь тип integer?

Ответы [ 2 ]

0 голосов
/ 27 августа 2018

SUM изменяет тип данных чисел на большие значения, поэтому он не складывается в число, которое переполняется:

bigint для аргументов smallint или int, числовое для аргументов bigint, в остальном совпадает с типом данных аргумента

0 голосов
/ 27 августа 2018

Да. Приведите его как целое число с помощью суммы (объема) :: целого числа, например:

 SELECT
     time, 
     SUM(volume)::integer AS volume, 
 here
     SUM(volume * price) / SUM(volume) AS price
 INTO
     foo
 FROM
     foo_raw
 GROUP BY
     time
 ORDER BY
   time;

Если вы действительно беспокоитесь о типах данных результирующего набора, я бы соответствующим образом приводил каждый столбец.

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