ROW_NUMBER,RANK(),DENSE_RANK()
先了解這三個之間的區別:
Rank():1,2,2,4,5(一般用這個較多,不會影響總排名)
Dense_rank():1,2,2,3,4,5(會影響最終排名)
Row_number():1,2,3,4,5,6(按照行數顯示)
語法格式:row_number() OVER (partition by COL1 order by COL2 desc ) rank
partition by:類似hive的建表,分區的意思;
order by :排序,默認是升序,加desc降序;
rank:表示別名
表示根據COL1分組,在分組內部根據 COL2排序,而此函數計算的值就表示每組內部排序后的順序編號(組內連續的唯一的)
取TOPN數據
按照國家提取TOP3
樣本數據:
國家 城市 Visitors
阿聯酋,阿布扎比,137
阿聯酋,阿布扎比,146
阿聯酋,阿布扎比,178
阿聯酋,阿布扎比,337
阿聯酋,阿布扎比,178
阿聯酋,阿布扎比,227
阿聯酋,阿布扎比,157
阿聯酋,迪拜,144
阿聯酋,迪拜,268
阿聯酋,迪拜,103
阿聯酋,迪拜,141
阿聯酋,迪拜,108
阿聯酋,迪拜,266
澳大利亞,悉尼,141
澳大利亞,悉尼,122
澳大利亞,悉尼,153
澳大利亞,悉尼,128
澳大利亞,墨爾本,294
澳大利亞,墨爾本,230
澳大利亞,墨爾本,159
澳大利亞,墨爾本,188
澳大利亞,堪培拉,249
澳大利亞,堪培拉,378
澳大利亞,堪培拉,255
澳大利亞,堪培拉,240
導入數據
1 --執行下述語句 2 hive (temp)> hive -f 'HQL/loaddata.hql'>out/tmp; 3 ----------------------------------------------- 4 drop table temp.tripdata; 5 CREATE table datatable ( 6 country string, 7 city string, 8 Visitors int) 9 ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' 10 STORED AS TEXTFILE; 11 12 load data local inpath 'home/loaddata' 13 overwrite into table temp.tripdata; 14 ---------------------------------------------- 15 16 ---------------------------------------------- 17 --查看結果 18 hive (temp)> select * from tripdata; 19 country city visitors
阿聯酋 阿布扎比 137 阿聯酋 阿布扎比 146 阿聯酋 阿布扎比 178 阿聯酋 阿布扎比 337 阿聯酋 阿布扎比 178 阿聯酋 阿布扎比 227 阿聯酋 阿布扎比 157 阿聯酋 迪拜 144 阿聯酋 迪拜 268 阿聯酋 迪拜 103 阿聯酋 迪拜 141 阿聯酋 迪拜 108 阿聯酋 迪拜 266 澳大利亞 悉尼 141 澳大利亞 悉尼 122 澳大利亞 悉尼 153 澳大利亞 悉尼 128 澳大利亞 墨爾本 294 澳大利亞 墨爾本 230 澳大利亞 墨爾本 159 澳大利亞 墨爾本 188 澳大利亞 堪培拉 249 澳大利亞 堪培拉 378 澳大利亞 堪培拉 255 澳大利亞 堪培拉 240
1 select country,city,visitors 2 from tripdata 3 order by visitors desc 4 limit 5; 5 6 country city visitors
澳大利亞 堪培拉 378 阿聯酋 阿布扎比 337 澳大利亞 墨爾本 294 阿聯酋 迪拜 268 阿聯酋 迪拜 266
按照國家、提取城市TOP3
1 select a.* 2 from ( 3 select country,city,visitors, row_number() over (partition by country order by visitors desc ) rank 4 from tripdata 5 order by country,visitors desc 6 ) a 7 where a.rank<=3; 8 9 --結果 10 a.country a.city a.visitors a.rank
結果如下: 澳大利亞 堪培拉 378 1 澳大利亞 墨爾本 294 2 澳大利亞 堪培拉 255 3 阿聯酋 阿布扎比 337 1 阿聯酋 迪拜 268 2 阿聯酋 迪拜 266 3
按照城市提取TOP3
1 select a.* 2 from ( 3 select country,city,visitors, row_number() over (partition by city order by visitors desc ) rank 4 from tripdata 5 order by country,city,visitors desc 6 ) a 7 where a.rank<=3;
--結果 a.country a.city a.visitors a.rank 澳大利亞 堪培拉 378 1 澳大利亞 堪培拉 255 2 澳大利亞 堪培拉 249 3 澳大利亞 墨爾本 294 1 澳大利亞 墨爾本 230 2 澳大利亞 墨爾本 188 3 澳大利亞 悉尼 153 1 澳大利亞 悉尼 141 2 澳大利亞 悉尼 128 3 阿聯酋 迪拜 268 1 阿聯酋 迪拜 266 2 阿聯酋 迪拜 144 3 阿聯酋 阿布扎比 337 1 阿聯酋 阿布扎比 227 2 阿聯酋 阿布扎比 178 3