Oracle

為 GROUP BY 選擇任意單個值:最快的選項是什麼?

  • October 14, 2020

我有一個查詢,用於指示地圖中存在重疊點的位置:

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

在我使用的映射軟體中,我需要包含 和 之類的objectidshape。對於這些列,值來自哪個分組行無關緊要,只要有一個值即可。

目前,我正在使用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

引用自:https://dba.stackexchange.com/questions/276849