參考連結: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()等等)。
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;
這個sql的作用就是根據province分組,並且分組後的每組的資料按照persons正序排序。
我們看到透過partition by分組後,select中是可以查出非分組的欄位,這和group by是不一樣的。