1. 程式人生 > >group by 與partition by 的效果展示,希望對大家有幫助

group by 與partition by 的效果展示,希望對大家有幫助

student.uid     student.xi      student.fuid
1       1       1
1       1       3
2       1       10
2       2       11
1       1       4
1       2       5
1       2       6
2       1       7
2       1       8
2       1       9
1       1       2
2       2       12
2       2       13

1.group by先以uid分組再以xi分組(group by 的所有非聚合欄位都放在group byzhong 而且partition不必這樣)
select
uid,
xi,
count(fuid)
from
student
group by uid,xi;

uid     xi      _c2
1       1       4
1       2       2
2       1       4
2       2       3

2.分組排序(分組與排序互不影響)
select
uid,
xi,
count(fuid) as mycount
from
student
group by uid,xi order by mycount;

OK
uid     xi      mycount
1       2       2
2       2       3
2       1       4
1       1       4


select
uid,
xi,
count(fuid) as mycount
from
student
group by uid,xi order by xi desc;
uid     xi      mycount
2       2       3
1       2       2
2       1       4
1       1       4
group by 與order by 互不影響

3.partition by order by 的使用

select
uid,
xi,
count(fuid) over(partition by uid,xi order by xi desc) as myrow 
from
student;

uid     xi      myrow
1       2       2
1       2       2
1       1       4
1       1       4
1       1       4
1       1       4
2       2       3
2       2       3
2       2       3
2       1       4
2       1       4
2       1       4
2       1       4

分完區後資料的行數不會減少,只是為每一行增加了一個屬相,order by 後面不能加limit

4.partition by 不與order 不與 結合也可以使用
select
uid,
xi,
count(fuid) over(partition by uid,xi) as myrow 
from
student;

5.分割槽計數後各個分割槽去掉重複值

select
*
from
(
select
uid,
xi,
mycon,
row_number() over(partition by uid,xi order by mycon desc) as myrow
from
(
select
uid,
xi,
count(fuid) over(partition by uid,xi) as mycon 
from
student
) t1
) t2 where myrow<=1;

OK
t2.uid  t2.xi   t2.mycon        t2.myrow
1       1       4       1
1       2       2       1
2       1       4       1
2       2       3       1

6.partition分割槽計數後 相同記錄標號一樣兩條2下來是3
select
uid,
xi,
mycon,
dense_rank() over(partition by uid,xi order by mycon desc) as myrow
from
(
select
uid,
xi,
count(fuid) over(partition by uid,xi) as mycon 
from
student
) t1;

7.group by 與cluster by結合區域性排序

select
uid,
xi,
count(fuid) as mycount
from
student
group by uid,xi distribute by xi desc sort by xi desc;

8.分組後計數,去重標號後取前幾名
select
*
from
(
select
uid,
xi,
mycon,
row_number() over(partition by uid,xi order by mycon desc) as myrow
from
(
select
uid,
xi,
count(fuid) over(partition by uid,xi) as mycon 
from
student
) t1
) t2 where myrow<=1;