首頁 > 資料庫 > mysql教程 > Oracle 聚合函數中的「KEEP」子句如何影響「PARTITION BY」?

Oracle 聚合函數中的「KEEP」子句如何影響「PARTITION BY」?

Linda Hamilton
發布: 2024-12-29 21:06:21
原創
381 人瀏覽過

How Does the `KEEP` Clause Affect `PARTITION BY` in Oracle Aggregate Functions?

Oracle 中帶和不帶KEEP 的PARTITION BY

Oracle 中的PARTITION BY 子句允許您將資料表中的行進行分組並執行聚合函數關於這些群體。 KEEP 子句與 PARTITION BY 子句一起使用時,可讓您指定在計算聚合函數時要保留哪些行。

考慮以下兩個查詢:

SELECT empno,
   deptno,
   sal,
   MIN(sal) OVER (PARTITION BY deptno) "Lowest",
   MAX(sal) OVER (PARTITION BY deptno) "Highest"
FROM empl

SELECT empno,
   deptno,
   sal,
   MIN(sal) KEEP (DENSE_RANK FIRST ORDER BY sal) OVER (PARTITION BY deptno) "Lowest",
   MAX(sal) KEEP (DENSE_RANK LAST ORDER BY sal) OVER (PARTITION BY deptno) "Highest"
FROM empl
登入後複製

這兩個查詢似乎為了得到相同的結果:他們計算每個部門的最低和最高工資。但是,這兩個查詢之間存在細微差別。

在第一個查詢中,MIN 和 MAX 函數會套用於每個分區中的所有行。在第二個查詢中,KEEP 子句用於指定計算中僅包含每個分區中的第一行和最後一行。

KEEP 子句可以與任何聚合函數一起使用。當您想要尋找一組行中某個值的第一次或最後一次出現時,它特別有用。

例如,以下查詢尋找每個部門中薪水最高的員工的名字和姓氏:

SELECT empno,
   deptno,
   sal,
   MIN(name) KEEP (DENSE_RANK FIRST ORDER BY sal) OVER (PARTITION BY deptno) AS "First Highest Salary",
   MAX(name) KEEP (DENSE_RANK LAST ORDER BY sal) OVER (PARTITION BY deptno) AS "Last Highest Salary"
FROM empl
GROUP BY deptno
登入後複製

KEEP 子句也可用於最佳化效能。透過指定僅應將每個分區中的第一行或最後一行包含在計算中,可以減少資料庫需要處理的資料量。這可以提高查詢的效能,特別是在您使用大型資料集時。

以上是Oracle 聚合函數中的「KEEP」子句如何影響「PARTITION BY」?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板