需求分析
现有交易数据表user_trade如下:
-
user_id 用户id
-
pay_amount 用户支付额度
现在老板想知道总支付金额在前20%的用户。
输出要求如下:
-
user_id用户名(前20%的用户)
实现
(1)数据准备
1001,100.7 1001,70.8 1002,50.4 1003,70 1005,100.5 1002,80.1 1003,36.7 1004,38.5 1003,50 1004,30 1004,300.5 1005,500 1005,3 1006,260.1 1007,360.4 1008,680
(2)创建表
CREATE TABLE user_trade ( user_id string, pay_amount double ) ROW format delimited FIELDS TERMINATED BY ",";
(3)加载数据
load data inpath "/origin_data/user_trade.txt" into table user_trade;
(4)需求实现
分析:
Ntile函数使用
可以看成是:它把有序的数据集合平均分配到指定的数量(num)个桶中, 将桶号分配给每一行。如果不能平均分配,则优先分配较小编号的桶,并且各个桶中能放的行数最多相差1。
语法是:ntile (num) over ([partition_clause] order_by_clause) as your_bucket_num 然后可以根据桶号,选取前或后 n