【问题标题】:Combining two select expressions with left join将两个选择表达式与左连接结合起来
【发布时间】:2019-12-27 09:25:44
【问题描述】:

您好,我正在尝试为我的回归研究收集汇总的时间序列数据。我需要使用日期键在一个纵向表中左连接多个选择。但是,因为我正在处理一个相当大的数据框,所以我需要限制查询的日期间隔。


SELECT ts.date_of_transaction,
           s.rev

    FROM db.transaction as ts
    --Where ts.date_of_transaction > date '2019-08-13'

LEFT JOIN 

(select date_of_transaction, sum(amount) as rev from db.transaction where  date_of_transaction >= date '2019-08-13' and
    main_group_number=200 and
    group_number=15 and
    class_number in (45,25,20,30)
    group by date_of_transaction) as s 

ON  ts.date_of_transaction = s.date_of_transaction; 

当我在第四行关闭 where 子句时,我的查询没有任何问题。但是,当我添加时间过滤器来查询外部表时,我收到以下错误...

选择失败。 3706: 语法错误:期望在字符串或 Unicode 字符文字和 'LEFT' 关键字之间。

【问题讨论】:

  • date '2019-08-13' 这看起来不对。它应该类似于to_date('2019-08-13', 'YYYY-MM-DD')
  • @JorgeCampos: date '2019-08-13' 是正确的,它是标准 SQL 日期文字,除了 Teradata 之外,许多 DBMS 都支持它。例如甲骨文、Postgres、MySQL
  • @dnoeth 感谢您提供的信息,不知道 date 可以用作这样的文字。每天学习:)

标签: sql left-join teradata


【解决方案1】:

您不能在 SELECT 的 WHERE 子句中执行 JOIN。将 WHERE 放在最后。

SELECT ts.date_of_transaction,
           s.rev

    FROM db.transaction as ts

LEFT JOIN 

(select date_of_transaction, sum(amount) as rev from db.transaction where  date_of_transaction >= date '2019-08-13' and
    main_group_number=200 and
    group_number=15 and
    class_number in (45,25,20,30)
    group by date_of_transaction) as s 

ON  ts.date_of_transaction = s.date_of_transaction

Where ts.date_of_transaction > date '2019-08-13'

【讨论】:

    【解决方案2】:

    您在本节中有错误。有很多方法可以将字符串值转换为日期格式。您可以找到此链接寻求帮助。 link

    select date_of_transaction, sum(amount) as rev from db.transaction where 
     date_of_transaction >= cast('2019-08-13' as date) and    ---- here instead of date You need to cast your string to date
        main_group_number=200 and
        group_number=15 and
        class_number in (45,25,20,30)
        group by date_of_transaction
    
    

    【讨论】:

    • date '2019-08-13' 是正确的,也是写日期的最简单/推荐的方式。它是标准 SQL 日期文字,除 Teradata 外,许多 DBMS 都支持它。例如甲骨文、Postgres、MySQL
    【解决方案3】:

    最简单的方法 -

    其中 ts.date_of_transaction > '2019 年 8 月 13 日'

    【讨论】:

      【解决方案4】:

      根据您的实际查询,您也许可以将 Left Join 替换为 Windowed Aggregate 加上 Case(尤其是当您访问同一张表多次使用不同的 Where 条件或不同的聚合级别),例如

      SELECT ts.date_of_transaction,
             sum(case when main_group_number=200
                       and group_number=15
                       and class_number in (45,25,20,30)
                      then amount
                  end)
             over (partition by date_of_transaction) as rev
      FROM db.transaction as ts
      Where ts.date_of_transaction > date '2019-08-13'
      

      用于我的回归研究

      Teradata 内置了一些统计/回归函数,例如KURTOSIS, REGR_SLOPE, ...

      【讨论】:

        猜你喜欢
        • 2021-09-28
        • 1970-01-01
        • 2012-05-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多