select
t1.category_id,
category_name,
sku_id,
name,
order_num,
order_cnt
from (
select
category_id,
si.sku_id,
name,
order_num,
rank() over (partition by category_id order by order_num desc ) rk,
count(distinct od.sku_id) over(partition by category_id) order_cnt
from (
select
sku_id,
sum(sku_num) order_num
from order_detail
group by sku_id )od
left join sku_info si on si.sku_id=od.sku_id )t1
left join category_info ci on ci.category_id=t1.category_id
where rk=1;
这里自然是用开窗函数最适合,然后需要计算金额,那么使用sum()开窗即可,之后的vip等级可以用case when
代码实现:
select user_id,
create_date,
sum_so_far,
case
when sum_so_far >= 100000 then '钻石会员'
when sum_so_far >= 80000 then '白金会员'
when sum_so_far >= 50000 then '黄金会员'
when sum_so_far >= 30000 then '白银会员'
when sum_so_far >= 10000 then '青铜会员'
when sum_so_far >= 0 then '普通会员'
end vip_level
from (
select user_id,
create_date,
sum(total_amount_per_day) over (partition by user_id order by create_date) sum_so_far
from (
select user_id,
create_date,
sum(total_amount) total_amount_per_day
from order_info
group by user_id, create_date
) t1
) t2;
select
concat(round(sum(if(datediff(buy_date_second, buy_date_first) = 1, 1, 0))
/ count(*) * 100, 1), '%') percentage
from (
select user_id,
min(create_date) buy_date_first,
max(create_date) buy_date_second
from (
select user_id,
create_date,
rank() over (partition by user_id order by create_date) rk
from (
select user_id,
create_date
from order_info
group by user_id, create_date
) t1
) t2
where rk <= 2
group by user_id
) t3;
注意:
1、字符串连接函数:concat
语法: concat(string A, string B...)
返回值: string
说明:返回输入字符串连接后的结果,支持任意个输入字符串
sql复制代码
hive> select concat('abc','def','gh') from iteblog;
abcdefgh
2、取整函数: round
语法: round(double a)
返回值: BIGINT
说明: 返回double类型的整数值部分 (遵循四舍五入)
sql复制代码
hive> select round(3.1415926) from iteblog;
3
hive> select round(3.5) from iteblog;
4
hive> create table iteblog as select round(9542.158) from iteblog;
hive> describe iteblog;
_c0 bigint