Sql Google BigQuery中与子查询的自连接

Sql Google BigQuery中与子查询的自连接,sql,google-bigquery,Sql,Google Bigquery,我是一个SQL noob,需要使用NYC 2013出租车出行数据集进行特定查询的帮助 我想分析肯尼迪机场的接送情况,但我想建立我的查询,这样我就可以包括出租车在机场接送某人后的下一次接送 此查询为我获取给定日期内机场的所有行程: SELECT * FROM [833682135931:nyctaxi.trip_data] WHERE DATE(pickup_datetime) = '2013-05-01' AND FLOAT(pickup_latitude) < 40.651381

我是一个SQL noob,需要使用NYC 2013出租车出行数据集进行特定查询的帮助

我想分析肯尼迪机场的接送情况,但我想建立我的查询,这样我就可以包括出租车在机场接送某人后的下一次接送

此查询为我获取给定日期内机场的所有行程:

SELECT * FROM [833682135931:nyctaxi.trip_data] 
WHERE DATE(pickup_datetime) = '2013-05-01'
  AND FLOAT(pickup_latitude) < 40.651381
  AND FLOAT(pickup_latitude) > 40.640668
  AND FLOAT(pickup_longitude) < -73.776283
  AND FLOAT(pickup_longitude) > -73.794694
我想将数据集与其自身连接起来,为每行添加下一次拾取时间、下一次拾取时间和下一次拾取时间值

为此,我假设我需要一个相关子查询,但不知道从哪里开始构建它,因为子查询基于外部查询


它需要在同一天搜索具有相同徽章且取货时间晚于当前机场下车时间的行程,然后限制1。。。非常感谢您的帮助

考虑使用滞后窗口函数而不是自联接

我认为N.N.的想法是正确的,只是你想要超前而不是滞后来获得下一次拾取。例如,此查询将生成下一次拾取时间、在JFK拾取后的lat和long

SELECT
    medallion,
    pickup_datetime,
    pickup_longitude,
    pickup_latitude,
    LEAD(pickup_datetime, 1, "") OVER (PARTITION BY medallion ORDER BY pickup_datetime) AS next_datetime,
    LEAD(pickup_longitude, 1, "0.0") OVER (PARTITION BY medallion ORDER BY pickup_datetime) AS next_longitude,
    LEAD(pickup_latitude, 1, "0.0") OVER (PARTITION BY medallion ORDER BY pickup_datetime) AS next_latitude
FROM [833682135931:nyctaxi.trip_data]
WHERE DATE(pickup_datetime) = '2013-05-01'
  AND FLOAT(pickup_latitude) < 40.651381
  AND FLOAT(pickup_latitude) > 40.640668
  AND FLOAT(pickup_longitude) < -73.776283
  AND FLOAT(pickup_longitude) > -73.794694;

任何时候都可以避免自动加入,这样做很好。

这将为您提供下一次接送的所有接送

SELECT *
FROM
  (SELECT medallion,
          dropoff_datetime,
          dropoff_longitude,
          dropoff_latitude,
          LEAD(pickup_datetime, 1, "") OVER (PARTITION BY medallion
                                             ORDER BY pickup_datetime) AS next_datetime,
          LEAD(pickup_longitude, 1, "0.0") OVER (PARTITION BY medallion
                                                 ORDER BY pickup_datetime) AS next_longitude,
          LEAD(pickup_latitude, 1, "0.0") OVER (PARTITION BY medallion
                                                ORDER BY pickup_datetime) AS next_latitude
   FROM [833682135931:nyctaxi.trip_data]) d
WHERE date(next_datetime)=date(dropoff_datetime)
  AND DATE(dropoff_datetime) = '2013-05-01'
  AND FLOAT(dropoff_latitude) < 40.651381
  AND FLOAT(dropoff_latitude) > 40.640668
  AND FLOAT(dropoff_longitude) < -73.776283
  AND FLOAT(dropoff_longitude) > -73.794694

这是根据Pentium10的答案修改而成的最终效果:

SELECT *
FROM
  (SELECT medallion,
          dropoff_datetime,
          dropoff_longitude,
          dropoff_latitude,
          LEAD(pickup_datetime, 1, "") OVER (PARTITION BY medallion
                                             ORDER BY pickup_datetime) AS next_datetime,
          LEAD(pickup_longitude, 1, "0.0") OVER (PARTITION BY medallion
                                                 ORDER BY pickup_datetime) AS next_longitude,
          LEAD(pickup_latitude, 1, "0.0") OVER (PARTITION BY medallion
                                                ORDER BY pickup_datetime) AS next_latitude
   FROM [833682135931:nyctaxi.trip_data]) d
WHERE date(next_datetime)=date(dropoff_datetime)
  AND DATE(dropoff_datetime) = '2013-05-01'
  AND FLOAT(dropoff_latitude) < 40.651381
  AND FLOAT(dropoff_latitude) > 40.640668
  AND FLOAT(dropoff_longitude) < -73.776283
  AND FLOAT(dropoff_longitude) > -73.794694

我不认为这会起作用,因为车辆的下一次行程不是数据集中的下一行,有13000辆出租车的行程都在一个表中…谢谢!所以我测试了一下,我仍然认为我们还没有达到目标。。。我想要在机场下车的出租车和他们的下一辆皮卡,这个查询包含所有的皮卡。我试着自己调整一下,但运气不太好。我意识到我原来的查询也有这个错误。。。所有这些皮卡都应该是下车的,所以我认为LEAD不会真正起作用,因为WHERE条款已经在机场附近的lat lon过滤掉了。如果下一次接送不在机场,则不会有具有相同徽章的领先行,并且此查询将为lat LON抛出0。此查询仅指在肯尼迪机场的接送,即使他们不是下一次行程。您需要首先在子查询中进行引导,然后在父查询中使用where对其进行过滤。这是查看机场的接机情况并获取下一次接机。我需要在机场下车,然后接下一辆。除了LEAD语句中的那些,我把所有的拾音器都换成了辍学器,但现在它只是永远地查询。。。没关系,成功了,只花了400秒!这将在子查询中编译下一次拾取的每一行。然后在外部查询中,您将其限制为同一天,将JFK皮卡和过滤器限制为给定的日期。有时在BQ上查询可能需要5-6分钟。