【问题标题】:Performing 2 JOINs on same table在同一张表上执行 2 个 JOIN
【发布时间】:2021-01-25 08:10:37
【问题描述】:

我在 Google BigQuery 中使用标准 SQL。我试图列出 2018 年 12 月从北格林威治村到南格林威治村的 tlc 黄色旅行次数(这些是taxi_zone_geom 表中的 zone_id)和总量。 zone_id 对应 tlc_yellow_trips_2018 表中的pickup_location_id 和 dropoff_location_id。

taxi_zone_geom 表:

Row zone_id zone_name   borough zone_geom
1   1   Newark Airport  EWR POLY
2   3   Allerton/Pelham Gardens Bronx   POLYGON((-73.8...

trips_2018 表

Row vendor_id   pickup_datetime dropoff_datetime    passenger_count trip_distance   rate_code   store_and_fwd_flag  payment_type    fare_amount extra   mta_tax tip_amount  tolls_amount    imp_surcharge   total_amount    pickup_location_id  dropoff_location_id 
1   2   2018-05-06T21:13:05 2018-05-06T21:35:33 1   9.83    1   N   1   29  0.5 0.5 6.06    0   0.3 36.36   138 65  
2   1   2018-05-06T21:59:42 2018-05-06T22:25:17 1   10.7    1   N   1   32  0.5 0.5 6.65    0   0.3 39.95   138 25  
3   1   2018-05-06T23:54:05 2018-05-07T00:19:30 2   9.6 1   N   1   30.5    0.5 0.5 6.35    0   0.3 38.15   114 116 

这很好用:

SELECT EXTRACT(MONTH FROM pickup_datetime) AS Month,
COUNT(*) AS Dec_trips_GVNorth_to_GVSouth,
SUM(total_amount) as total,
FROM `bigquery-public-data.new_york_taxi_trips.tlc_yellow_trips_2018` AS t 
LEFT JOIN `bigquery-public-data.new_york_taxi_trips.taxi_zone_geom` AS g ON t.pickup_location_id=g.zone_id WHERE g.zone_name='Greenwich Village North'
GROUP BY Month HAVING Month=12

但是,我需要通过加入同一个表来链接到 drop_off,我尝试使用如下所示的辅助连接来执行此操作:

LEFT JOIN `bigquery-public-data.new_york_taxi_trips.taxi_zone_geom` AS g2 ON t.dropoff_location_id=g2.zone_id WHERE g2.zone_name='Greenwich Village South' 

这会导致错误“语法错误:预期输入结束,但在 [7:1] 获得关键字 LEFT”

我做错了什么?谢谢

【问题讨论】:

  • 请在代码问题中给出minimal reproducible example--cut & paste & runnable code,包括最小的代表性示例输入作为代码;期望和实际输出(包括逐字错误消息);标签和版本;明确的规范和解释。给出尽可能少的代码,即您显示的代码可以通过您显示的代码扩展为不正常的代码。 (调试基础。)对于包含 DBMS 和 DDL(包括约束和索引)的 SQL,并以表格格式作为代码输入。 How to Ask 暂停总体目标的工作,将代码砍到第一个表达式,没有给出你期望的内容,说出你期望的内容和原因。
  • 您有语法错误。阅读语法和手册。显示组成子表达式是好的。

标签: sql count google-bigquery sum inner-join


【解决方案1】:

我将其理解为两个连接,在 WHERE 子句中进行过滤:

SELECT 
    COUNT(*) AS Dec_trips_GVNorth_to_GVSouth,
    SUM(total_amount) as total
FROM `bigquery-public-data.new_york_taxi_trips.tlc_yellow_trips_2018` AS t 
INNER JOIN `bigquery-public-data.new_york_taxi_trips.taxi_zone_geom` AS g1 
    ON t.pickup_location_id = g1.zone_id 
INNER JOIN `bigquery-public-data.new_york_taxi_trips.taxi_zone_geom` AS g2
    ON t.dropoff_location_id = g2.zone_id 
WHERE 
    g1.zone_name = 'Greenwich Village North'
    AND g2.zone_name = 'Greenwich Village South'
    AND pickup_datetime >= date '2018-12-01'
    AND pickup_datetime >= date '2019-01-01'

注意事项:

  • 由于您想实际过滤接送地点,请使用INNER JOINs,而不是LEFT JOINs

  • 我认为不需要明确的 GROUP BY 子句,也不需要 HAVING 子句:您可以直接在 WHERE 子句中过滤目标月份,使用半开间隔和文字日期

  • 如果表格只有 2018 年的数据,顾名思义,那么上限日期范围的过滤条件是多余的

【讨论】:

  • 谢谢!除了完全回答我的问题之外,您还分享了宝贵的信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-19
  • 2011-04-06
  • 2015-09-02
  • 2016-10-14
  • 2011-10-18
相关资源
最近更新 更多