如何解决在同一张桌子上执行2个JOIN
我在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'
这将导致错误“语法错误:预期输入结束,但关键字LEFT为[7: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 JOIN
s,而不要使用LEFT JOIN
s -
我认为不需要显式的
GROUP BY
子句,也不需要HAVING
子句:您可以直接在WHERE
子句中过滤目标月份,使用半开时间间隔和原义日期 -
如果该表仅包含其名称所暗示的2018年数据,那么多余日期范围的过滤条件就多余了
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。