dudemcgregor
dudemcgregor

Reputation: 69

How to Left Join in Presto SQL?

Can't for the life of me figure out a simple left join in Presto, even after reading the documentation. I'm very familiar with Postgres and tested my query there to make sure there wasn't a glaring error on my part. Please reference code below:

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

Running that gives the following error

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)

Upvotes: 0

Views: 24935

Answers (2)

jpavs
jpavs

Reputation: 658

One option is to declare your subqueries by using 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;

Upvotes: 1

Ike Walker
Ike Walker

Reputation: 65567

The first problem I notice is that your join clause assumes the first sub-query is aliased as a, but it is not aliased at all. I recommend aliasing that table to see if that fixes it (I also recommend aliasing the order_date column explicitly outside of the cast() statement since you are joining on that column).

Try this:

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

Upvotes: 3

Related Questions