【问题标题】:How to Left Join in Presto SQL?如何在 Presto SQL 中左连接?
【发布时间】:2018-07-20 10:10:03
【问题描述】:

即使在阅读文档之后,我也无法在 Presto 中找到一个简单的左连接。我对 Postgres 非常熟悉,并在那里测试了我的查询,以确保我没有明显的错误。请参考以下代码:

select * from

(select cast(order_date as date),   
        count(distinct(source_order_id)) as prim_orders, 
        sum(quantity) as prim_tickets, 
        sum(sale_amount) as prim_revenue 
from table_a
where order_date >= date '2018-01-01'
group by 1)

left join

(select summary_date, 
        sum(impressions) as sem_impressions, 
        sum(clicks) as sem_clicks, 
        sum(spend) as sem_spend,  
        sum(total_orders) as sem_orders, 
        sum(total_tickets) as sem_tickets, 
        sum(total_revenue) as sem_revenue 
from table_b
where site like '%SEM%'
and summary_date >= date '2018-01-01'
group by 1) as b

on a.order_date = b.summary_date

运行时出现以下错误

SQL Error: Failed to run query
  Failed to run query
    line 1:1: mismatched input 'on' expecting {'(', 'SELECT', 'DESC', 'WITH', 
'VALUES', 'CREATE', 'TABLE', 'INSERT', 'DELETE', 'DESCRIBE', 'GRANT', 
'REVOKE', 'EXPLAIN', 'SHOW', 'USE', 'DROP', 'ALTER', 'SET', 'RESET', 'START', 'COMMIT', 'ROLLBACK', 'CALL', 'PREPARE', 'DEALLOCATE', 'EXECUTE'} (Service: AmazonAthena; Status Code: 400; Error Code: InvalidRequestException; Request ID: a33a6671-07a2-4d7b-bb75-f70f7b82409e)
line 1:1: mismatched input 'on' expecting {'(', 'SELECT', 'DESC', 'WITH', 'VALUES', 'CREATE', 'TABLE', 'INSERT', 'DELETE', 'DESCRIBE', 'GRANT', 'REVOKE', 'EXPLAIN', 'SHOW', 'USE', 'DROP', 'ALTER', 'SET', 'RESET', 'START', 'COMMIT', 'ROLLBACK', 'CALL', 'PREPARE', 'DEALLOCATE', 'EXECUTE'} (Service: AmazonAthena; Status Code: 400; Error Code: InvalidRequestException; Request ID: a33a6671-07a2-4d7b-bb75-f70f7b82409e)

【问题讨论】:

    标签: presto


    【解决方案1】:

    我注意到的第一个问题是您的连接子句假定第一个子查询别名为a,但它根本没有别名。我建议为该表设置别名以查看是否可以修复它(我还建议在 cast() 语句之外显式地为 order_date 列添加别名,因为您正在加入该列)。

    试试这个:

    select * from
    
    (select cast(order_date as date) as order_date,   
            count(distinct(source_order_id)) as prim_orders, 
            sum(quantity) as prim_tickets, 
            sum(sale_amount) as prim_revenue 
    from table_a
    where order_date >= date '2018-01-01'
    group by 1) as a
    
    left join
    
    (select summary_date, 
            sum(impressions) as sem_impressions, 
            sum(clicks) as sem_clicks, 
            sum(spend) as sem_spend,  
            sum(total_orders) as sem_orders, 
            sum(total_tickets) as sem_tickets, 
            sum(total_revenue) as sem_revenue 
    from table_b
    where site like '%SEM%'
    and summary_date >= date '2018-01-01'
    group by 1) as b
    
    on a.order_date = b.summary_date
    

    【讨论】:

      【解决方案2】:

      一种选择是使用with 声明您的子查询:

      with a as 
        (select cast(order_date as date),   
          count(distinct(source_order_id)) as prim_orders, 
          sum(quantity) as prim_tickets, 
          sum(sale_amount) as prim_revenue 
        from table_a
        where order_date >= date '2018-01-01'
        group by 1),
      
      b as 
        (select summary_date, 
          sum(impressions) as sem_impressions, 
          sum(clicks) as sem_clicks, 
          sum(spend) as sem_spend,  
          sum(total_orders) as sem_orders, 
          sum(total_tickets) as sem_tickets, 
          sum(total_revenue) as sem_revenue 
        from table_b
        where site like '%SEM%'
        and summary_date >= date '2018-01-01'
        group by 1)
      
      select * from a
      left join b
      on a.order_date = b.summary_date;
      

      【讨论】:

        猜你喜欢
        • 2018-02-21
        • 1970-01-01
        • 2011-11-22
        • 2021-01-22
        • 1970-01-01
        • 2017-03-10
        • 2016-10-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多