Big Query中复杂的SQL选择语句

时间:2015-10-28 19:44:41

标签: sql-server google-bigquery

我有一个包含4列的表,latLng,dataTime,stage和index。我希望以结果为

的方式查询表
  • 在一个时间范围内
  • 没有latlng的重复,返回最新的latLng,其性质为“lat,lng”,例如。 23.123,1344
  • 按阶段排序然后索引。
  • 在latLng的指定半径范围内。

不知道如何在sql语句中实现这一点,但是big query使事情变得更糟,不支持像distinct这样的coz语句。到目前为止我的选择只是为了实现列表中的前2个确实具有挑战性。

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

1 个答案:

答案 0 :(得分: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