【问题标题】:Can I sum up two columns from temporary tables together?我可以将临时表中的两列加在一起吗?
【发布时间】:2020-04-27 11:22:03
【问题描述】:

我创建了 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

出错了。然后我尝试了Here它显示Daydiff不存在

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

这也有错误。你能帮我如何将 XXX2 到 XXX1 的天数相加吗?所以第一行应该有 2019-04-28,下一个 2019-04-30... 可能问题是这两个表是临时的,但是对于整个查询我需要这些临时表。表格。

【问题讨论】:

  • SQL 表代表 无序 集合。我不明白您如何匹配两个表之间的行。您还说您有 三个 临时表,但您的问题只涉及其中两个。令人困惑。
  • @GordonLinoff 我在想我可以像用另一种语言一样做到这一点。但是我怎样才能将 XXX2 中的这些日子添加到 XXX1 中的日期。或者,如果我在 XXX2 的所有行中都有完全相同的数字(比如 1),我可以将它添加到 XXX1 中的所有日期吗?

标签: sql vertica


【解决方案1】:

@约翰·梅耶:

正如@Gordon Linoff 指出的:SQL 是无序集的描述性语言。

如果您想将第五个元组 ('2019-04-28 21:00', 5) 与另一个第五个元组 ( 5) 匹配,那么您需要使用匹配的标识符来唯一标识两个表的行,并使用连接功能来获取信息。

而且,如果您将 Vertica 指定为 RDBMS,则不应像上面那样在 VALUES 子句中使用多个元组,因为 Vertica 不支持它。

如果要在 Vertica 中创建内联表,则必须为此使用 SELECT .. UNION SELECT 语句。

把这些冠冕堂皇的说法排除在外,试试这个:

  1. 创建表(无论是临时的还是永久的,都无所谓),对数据类型进行最少的尽职调查 - 其中 DATETIMESTAMP 是两个不同的东西,绝对不是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
;
  1. 然后,运行一个连接两个表的查询,如下所示:
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)
;

【讨论】:

    猜你喜欢
    • 2010-12-12
    • 2020-10-18
    • 2019-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多