oracle partition by 語法

hasome發表於2024-06-20

參考連結:https://www.cnblogs.com/xfeiyun/p/17765225.html

資料準備

建表

create table xzq_person (       --行政區人口表
    province varchar(10),
    city varchar(10),
    persons number(10)
);

插入資料

insert into xzq_person values ('江蘇','蘇州',10);
insert into xzq_person values ('江蘇','南京',20);
insert into xzq_person values ('浙江','杭州',19);
insert into xzq_person values ('浙江','義烏',13);
insert into xzq_person values ('浙江','金華',11);
insert into xzq_person values ('廣東','廣州',18);
insert into xzq_person values ('廣東','深圳',18);
insert into xzq_person values ('廣東','中山',16);
insert into xzq_person values ('廣東','惠州',16);
insert into xzq_person values ('廣東','東莞',15);

partition by 的用法與含義

group by

首先我們看一下group by的用法,比如根據省份分組

select province, sum(persons) from xzq_person group by province;

使用了group by後,select語句中只能是分組的欄位(比如上面的province)或者是一個聚合函式(比如count()、sum()、max()等等)。
image

partition by

partition從字面上看是分割槽、分塊的意思,所以partition by其實就是根據某個欄位將資料分塊,然後可以對該分塊資料再做查詢(包括聚合查詢)。

例如,partition by常同row_number() over一起使用:

select province, city, persons, row_number() over(partition by province order by persons) from xzq_person;

image

這個sql的作用就是根據province分組,並且分組後的每組的資料按照persons正序排序。
我們看到透過partition by分組後,select中是可以查出非分組的欄位,這和group by是不一樣的。

相關文章