Oracle
為 GROUP BY 選擇任意單個值:最快的選項是什麼?
我有一個查詢,用於指示地圖中存在重疊點的位置:
select min(objectid) as min_objectid, longitudex, latitudey, count(1) as count, min(shape) as min_shape from workorders group by longitudex, latitudey having count(1) > 1
在我使用的映射軟體中,我需要包含 和 之類的
objectid
列shape
。對於這些列,值來自哪個分組行無關緊要,只要有一個值即可。目前,我正在使用
min()
為這些列獲取任意值。但是,我不知道這是否是最快的選擇,因為找到最小值需要計算——我想知道所花費的時間是否不必要。在 Oracle 查詢中獲取 GROUP BY 的任意/單個值的最快選擇是什麼?
您的查詢會返回重複的位置,但不會返回具有相同位置的各個點(工作訂單)。
這將再次返回這些位置(與您的查詢相同,只是以更緊湊的符號重新格式化):
select longitudex, latitudey, count(*) from workorders group by longitudex, latitudey having count(*) > 1;
然後這將返回共享同一位置的各個工作訂單:
select objectid, longitudex, latitudey, shape from workorders where (longitudex, latitudey) in ( select longitudex, latitudey from workorders group by longitudex, latitudey having count(*) > 1 );
顯然,只有在相同位置的工作訂單的地理座標完全相同(精確到小數點)的情況下,這才有效。如果不是,那麼您需要使用空間運算符來比較位置。這些可用於 Oracle(開箱即用)或 PostgreSQL(帶有 PostGis 擴展)等數據庫。
對於 Oracle 12.1 或更高版本,將其添加到查詢的末尾:
fetch first row only
順便說一句,
count(*)
據我所知,它是所有 SQL 變體的標準表達式。對於您的範例,這將是:
select min(objectid) as min_objectid, longitudex, latitudey, count(*) as count, min(shape) as min_shape from workorders group by longitudex, latitudey having count(*) > 1 fetch first 1 row only