2015-10-28 64 views
2

我有一个包含4列latLng,dataTime,stage和index的表。我想查询表的方式,其结果必然是大查询中复杂的SQL选择语句

  • 在一个时间范围
  • 没有经纬度的重复,返回最近的latLng这是自然“纬度,经度”例如。 23.123,1344
  • 按阶段排序然后索引。
  • 在latLng的指定半径内。

不知道如何在sql语句中实现这个功能,但big query正在让事情变得更糟糕,因为不支持明确的语句。到目前为止,我的选择仅仅是为了获得名单上的前两名,这真的很具有挑战性。

SELECT * FROM data.example 
WHERE timeCollected IN 
(SELECT max(timeCollected) FROM data.example GROUP BY latlng) order by col1,col2,col3 

以什么方式可以实现这一点,谢谢。

更新

这个说法,我能够到的范围和规定的时间内查询数据。但仍然无法选择具有最近的latlng的重复行(如果多个行具有相同的latlng,则应该选择最近的行)。

SELECT *, (3959 * acos(cos(radians(12.18663)) * cos(radians(lat)) * cos(radians(long) - radians(6.65604)) + sin(radians(12.18663)) * sin(radians(lat)))) AS distance FROM data.example WHERE TIMESTAMP(timeCollected) <= DATE_ADD(USEC_TO_TIMESTAMP(NOW()), 60, 'minute') HAVING distance < 25 ORDER BY 
distance ASC 
+0

你可以分享开放数据数据集吗?我会为你写查询,如果你做 –

+0

你可以在https://bigquery.cloud.google.com上找到很多测试样本 –

+0

@FelipeHoffa我如何分享数据集 –

回答

0

能够运行一段时间后才能做到。不知道这种说法可能有多高效,但它是这样的:

SELECT latlng, max(TIMESTAMP(timeCollected)) as timeCollected,first(sessionKey) as session,first(stage) as stage,first(index) as index, 
(3959 * acos(cos(radians(9.0071)) * cos(radians(lat)) * cos(radians(long) - radians(7.56511)) + sin(radians(9.0071)) * sin(radians(lat)))) AS distance 
FROM opendata.openQueryData WHERE TIMESTAMP(timeCollected) > DATE_ADD(USEC_TO_TIMESTAMP(NOW()), -60, 'minute') GROUP BY latlng,distance HAVING distance < 25 
order by session,stage,index ASC