sql - 根据日期选择下一个位置
问题描述
我有两个表,其中一个具有开始日期和 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;
解决方案
一种方法是聚合:
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;
推荐阅读
- c++ - 用于内存优化的字符串编码
- ios - 如何使用 XMPP 获取登录用户的组列表?
- kubernetes - 用于移动用户代理的 Kubernetes-Ingress Server-Snippet 503
- sql-server - 处理 SQL server 数据库中的特殊字符,应该使用 varchar 还是 nvarchar?
- rest - 如何放心保留登录会话?
- javascript - angular 7 应用程序无法在 Firefox 中运行,但在 chrome 和 edge 中运行良好
- c# - 如何在 ASP.net MVC 中填充组合框选定项更改的详细信息字段
- c# - 在这种情况下如何检查链表是否有循环
- dependency-injection - requireBinding 有什么用?
- swift - 从另一个类为 Present ViewController Swift 调用特定函数