場景準備
某張表裏有字段:provinceid、hour、adid,表示省份id、小時段和廣告id,每一行表示一份廣告點擊數據,模擬數據如下。
省份id 廣告id
1 1 100
1 1 100
1 2 100
1 2 112
1 1 101
1 2 112
1 2 102
1 1 102
1 1 103
1 2 112
1 2 112
1 1 101
1 2 112
2 1 100
2 1 121
2 2 101
2 2 121
2 1 104
2 2 121
2 2 111
2 1 104
2 1 103
2 2 111
2 2 121
2 1 104
3 2 121
3 2 112
3 1 112
3 2 121
3 1 100
業務要求
統計每一個省份每一個小時點擊量Top3的廣告,格式如下:
proid hour adid countclick rnk
1 1 100 2 1
1 1 101 2 2
1 1 102 1 3
1 2 112 5 1
1 2 100 1 2
1 2 102 1 3
2 1 104 3 1
2 1 103 1 2
2 1 100 1 3
2 2 121 3 1
2 2 111 2 2
2 2 101 1 3
3 1 100 1 1
3 1 112 1 2
3 2 121 2 1
3 2 112 1 2
SQL分析
select
proid,
hour,
adid,
countClick,
rnk
from
(
select
proid,
hour,
adid,
countClick,
row_number() over(
distribute by proid, hour sort by countClick desc
) rnk
from
(
select
proid,
hour,
adid,
count(*) countClick
from
pro_hour_ad_tmp
group by
proid,
hour,
adid
) t1 # 分組統計省份、小時、廣告和點擊量
) t # 根據省份id、小時分區,按點擊量降序排列,開窗口數據給排名函數
where
rnk <= 3;