2015-10-28 65 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