首页 > 解决方案 > 根据日期选择下一个位置

问题描述

我有两个表,其中一个具有开始日期和 ID:

Begin_Date                  ID
2015-12-14 00:00:00.0000000  1
2015-12-10 19:00:00.0000000  2
2015-12-09 19:00:00.0000000  3
2015-12-07 00:00:00.0000000  4
2015-12-06 00:00:00.0000000  5

另一个表具有基于 ID 的这些记录的关联位置:

DateAndTime                 ID
2015-12-14 00:00:00.0000000  1
2015-12-15 19:00:00.0000000  1
2015-12-16 19:00:00.0000000  1
2015-12-12 00:00:00.0000000  2
2015-12-13 00:00:00.0000000  2

我有一个将这两个表连接在一起的语句,但我正在努力编写这个查询的后半部分。我希望查询选择在开始日期之后或等于开始日期之后可用的第一个位置。所以对于 ID 1,查询2015-12-14 00:00:00.0000000将从 Table2 中选择。在大多数情况下,Table1 中的开始日期将等于 Table2 中可用的第一个 DateAndTime。但在其他情况下,第一个位置可能是一两天后。例如,2015-12-12 00:00:00.0000000 2即使开始日期为2015-12-10 19:00:00.0000000

到目前为止,我所拥有的是:

SELECT 
ST_GeogPoint(Longitude, Latitude) AS points,
Table1.ID
FROM `Table1` AS Table1 INNER JOIN 
`Table2` AS Table2 
ON Table1.ID = Table2.ID 
WHERE Table2.DateAndTime = Table1.BeginDate;

标签: sqlgoogle-bigquery

解决方案


一种方法是聚合:

SELECT t1.ID,
       ARRAY_AGG(ST_GeogPoint(Longitude, Latitude) ORDER BY t2.DateAndTime ASC LIMIT 1)[ORDINAL(1)] AS point
Table1.ID
FROM `Table1` t1 INNER JOIN 
     `Table2` AS Table2 
     ON t1.ID = t2.ID AND t2.DateAndTime >= t1.BeginDate
GROUP BY t1.id;

推荐阅读