詳解partition by和group by對比

2022-09-21 00:45:07 字數 1320 閱讀 8207

今天大概弄懂了partition by和group 程式設計客棧by的區別聯絡。

1. group by是分組函式,partition by是分析函式(然後像sum()等是聚合函式);

2. 在執行順序上,

以下是常用sql關鍵字的優先順序

from > where > group by > h**ing > order by

而partition by應用在以上關鍵字之後,實際上就是在執行完select之後,在所得結果集之上進行partition。

3.partition by相比較於group by,能夠在保留全部資料的基礎上,只對其中某些欄位做分組排序(類似excel中的操作),而group by則只保留參與分組的字段和聚合函式的結果(類似excel中的pivot)。

partition by

group by

4.如果在partition結果上聚合,千萬注意聚合函式是逐條累計執行結果的!而在group by後的結果集上使用聚合函式,會作用在分組下的所有記錄上。

資料如下,

sql1

select a.cc,a.item,sum(a.num)

from table_temp a

group by a.cc,a.item

result1

11條記錄經group by後為10條,其中cc='cn' and item='8.1.1'對應的兩條記錄的num彙總成值3.

sql2

select a.cc,a.num, min(a.num) over (partition by a.cc order by a.num asc) as amount

from table_temp a

group by a.cc,a.num;

select a.cc,a.num, min(a.num) over (partition by a.cc order by a.num desc) as amount

from table_temp a

group by a.cc,a.num;

result2

兩個sql的唯一區別在於a.num的排序上,但從結果紅框中的資料對比可以看到amount值並不相同,且第二個結果集amount並不都是最小值1。

在這裡就是要注意將聚合函式用在partition後的結果集上時,聚合函式是逐條累積計算值的!

其實partition by常同row_number() over一起使用,

select a.*, row_number() over (partition by a.cc,a.item order by a.num desc) as seq

from table_temp a

GNU組織的 gcc 和 g 的區別詳解

gcc 和 g 都是 gnu 組織的編譯器。誤區一 gcc 只能編譯 c g 只能編譯 c 兩者都可以,但是請注意 1.字尾為 c 的,gcc 把它當作是 c 程式,而 g 當作是 c 程式 字尾為.cpp的,兩者都會認為是 c 程式 注意 雖然 c 是 c 的超集,但是兩者對語法的要求是有區別的!...

oracle11g 服務詳解

成功安裝oracle 11g後,共有7個服務,這七個服務的含義分別為 1.oracle orcl vss writer service oracle卷對映拷貝寫入服務,vss volume shadow copy service 能夠讓儲存基礎裝置 比如磁碟,陣列等 建立高保真的時間點映像,即對映拷...

mysql g MySQL中 g和 G的作用

g的作用和mysql中的分號 是一樣 g的作用是講查詢到的內容結構旋轉90度,變成縱向結構 下面舉例說明,查詢資料庫中的存在的儲存過程狀態 show procedure status like pricing g 具體如下所示 mysql show procedure status like pri...