![](/img/trans.png)
[英]BigQuery: Multiple SQL rows merge into single row if the row content is the same
[英]bigquery geojson concat multiple rows from same user to a single row
正如標題所說,我如何將來自同一用戶的多行合並到一個 geojson 格式的行中,我嘗試按順序排序,但沒有運氣。 這是我正在使用的示例代碼,我也只能在這個數據庫上選擇
SELECT rh.routeid, st_asgeojson(st_geogpoint(locs.lon, locs.lat)
FROM demo.routebatches RB, demo.route R
cross join UNNEST(locations) as locs
where EXTRACT (date FROM TIMESTAMP_MILLIS (CAST(locs.date as INT64))) = "2017-03-10" and rh.cycleID = 'aff9bb7b-3b92-4620-bc50-1152edefe04c'
order by routeID
limit 100
這給出了這個結果,其中來自同一 routeid 的多個 long 和 lats 不是按 routeid 排序的。 我該如何解決這個問題?
geojson 會工作,但我也會采用這種格式,它來自超集中的deck.gl 路徑
這里有兩個問題:
如何對路線內的位置進行排序。 你寫下where multiple long and lats from the same routeid are not ordered by routeid
- 但這是一個令人困惑的陳述。 所有這些點( same routeid
)都具有相同的 routeid,那么如何by routeid
它們進行排序? 您可能希望它們在 routeid 組內排序,但您需要一個不同的字段來排序它們。
您需要將 routeid 內的所有點組合成一個線串,而不是將每個點分開。
此外,目前尚不清楚實際輸入架構是什么,以及 routebatches 表與路由表的關系,如果您澄清會有所幫助。 locations
字段屬於 RB 還是 R 表? 在沒有任何謂詞的情況下連接 RB 和 R 表的方式使每個 RB 行與每個 R 行交叉連接。
看起來locations
記錄有一個以毫秒為單位的date
字段 - 如果我們可以按這個字段排序,我會使用類似的東西
SELECT
rh.routeid,
st_asgeojson(st_makeline(
array_agg(st_geogpoint(locs.lon, locs.lat) order by locs.date)))
FROM demo.route R cross join UNNEST(locations) as locs
where
EXTRACT (date FROM TIMESTAMP_MILLIS (CAST(locs.date as INT64))) = "2017-03-10"
and rh.cycleID = 'aff9bb7b-3b92-4620-bc50-1152edefe04c'
GROUP BY routeID
order by routeID
limit 100
首先,我們按 routeId 分組,然后聚合( array_agg
)這條路線中的所有點,創建一個包含按時間戳排序的所有點的數組。 st_makeline
從此數組構建線串,然后您可以將其轉換為 geojson。
另外,請參閱這篇從公開 NOAA 數據創建類似線串的文章: https : //mentin.medium.com/longest-hurricane-eeb6844d65ed
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.