Можно ли суммировать два столбца из временных таблиц вместе? - PullRequest
0 голосов
/ 27 апреля 2020

Я создал 2 временных таблицы, которые мне нужно сложить. Т.е.

CREATE temp TABLE XXX1 (DATE TEXT, PRICE INTEGER);
INSERT INTO XXX1 VALUES 
('2019-04-27 01:00', 1), ('2019-04-27 02:30', 3), ('2019-04-27 18:00',2), 
('2019-04-28 17:00', 2), ('2019-04-28 21:00', 5), 
('2019-04-29 17:00',50), ('2019-04-29 21:00',10), 
('2019-04-30 17:00',10), ('2019-04-30 21:00',20), 
('2019-05-01 17:00',40), ('2019-05-01 21:00',10), 
('2019-05-02 17:00',10), ('2019-05-02 21:00', 6);

CREATE temp TABLE XXX2 (Daydiff INTEGER);
INSERT INTO XXX2 VALUES 
(1), ( 3), (2), 
(2), ( 5), 
(50), (10), 
(10), (20), 
(40), (10), 
(10), (6);

Я пытался использовать

select (DATE+Daydiff) as CorrectDate, Price from XXX2 XXX1

Всё пошло не так. Тогда я попробовал Вот это показывает, что Daydiff не существует

select (DATE+(SELECT Daydiff from XXX2)) as CorrectDate, Price from XXX1

И это также cam с ошибкой. Не могли бы вы помочь мне, как добавить дни с XXX2 до XXX1. Таким образом, первая строка должна иметь 2019-04-28, следующая 2019-04-30 ... Может проблема в том, что эти две таблицы являются временными, но для всего запроса мне нужны эти временные значения. таблицы.

1 Ответ

1 голос
/ 27 апреля 2020

@ Джон Майер:

Как отметил @Gordon Linoff: SQL - это описательный язык для неупорядоченных множеств.

Если вы хотите сопоставить пятый кортеж, ваш ('2019-04-28 21:00', 5), с другим пятым кортежем, вашим ( 5), то вам необходимо однозначно идентифицировать строки обеих таблиц с соответствующими идентификаторами и использовать функциональность объединения для получения информации.

И, если вы указали Vertica в качестве СУБД, вам не следует использовать несколько кортежей в предложении VALUES, как вы делали выше, поскольку Vertica не поддерживает его.

Если вы хотите создать встроенную таблицу в Vertica, вы должны использовать для этого инструкцию SELECT .. UNION SELECT.

С этими средствами понтификации попробуйте следующее:

  1. Создайте свои таблицы (временные или постоянные, не имеет значения) с минимальной должной осмотрительностью в отношении типов данных - где DATE и TIMESTAMP - это две разные вещи, а определенно не VARCHAR, не говоря уже о странных TEXT, которые вы используете, и, если вам нужно присоединиться к ним позже, с идентификаторами, а затем заполните их.
DROP TABLE IF EXISTS xxx1;
DROP TABLE IF EXISTS xxx2;
CREATE TABLE xxx1 (
  id    INTEGER
, dt    TIMESTAMP(0)
, price INTEGER
);

CREATE TABLE xxx2 (
  id      INTEGER
, daydiff INTEGER
);

INSERT INTO xxx1
          SELECT  1, TIMESTAMP '2019-04-27 01:00', 1
UNION ALL SELECT  2, TIMESTAMP '2019-04-27 02:30', 3                                                                                                                
UNION ALL SELECT  3, TIMESTAMP '2019-04-27 18:00', 2
UNION ALL SELECT  4, TIMESTAMP '2019-04-28 17:00', 2
UNION ALL SELECT  5, TIMESTAMP '2019-04-28 21:00', 5
UNION ALL SELECT  6, TIMESTAMP '2019-04-29 17:00',50
UNION ALL SELECT  7, TIMESTAMP '2019-04-29 21:00',10
UNION ALL SELECT  8, TIMESTAMP '2019-04-30 17:00',10
UNION ALL SELECT  9, TIMESTAMP '2019-04-30 21:00',20
UNION ALL SELECT 10, TIMESTAMP '2019-05-01 17:00',40
UNION ALL SELECT 11, TIMESTAMP '2019-05-01 21:00',10
UNION ALL SELECT 12, TIMESTAMP '2019-05-02 17:00',10
UNION ALL SELECT 13, TIMESTAMP '2019-05-02 21:00', 6
;

INSERT INTO xxx2
          SELECT   1, 1
UNION ALL SELECT   2, 3
UNION ALL SELECT   3, 2
UNION ALL SELECT   4, 2
UNION ALL SELECT   5, 5
UNION ALL SELECT   6,50
UNION ALL SELECT   7,10
UNION ALL SELECT   8,10
UNION ALL SELECT   9,20
UNION ALL SELECT  10,40
UNION ALL SELECT  11,10
UNION ALL SELECT  12,10
UNION ALL SELECT  13, 6
;
Затем выполните запрос, объединяющий две таблицы, например:
SELECT 
  dt::DATE + daydiff AS correct_date
, TIMESTAMPADD(day,daydiff,dt) AS correct_timestamp
, price
FROM xxx1
JOIN xxx2 
USING(id)
-- (or: ON xxx1.id = xxx2.id)
;
...