阿里几乎所有的订单系统的排名都会参考成交量(交易成功)这个指标,因此很多卖家为了使自己的排名靠前,不惜利用刷单行为来提高自己的排名(即虚假成交),
如果现在发现虚假刷单的特征其中一点:即低vip_level,买家的vip_level<=2,且买家注册时间和订单下单时间很近(如5天内)。
给出下面3张表,
卖家表 sellers (seller_id, create_time, vip_level),其中seller_id是买家用户id, create_time是注册时间,vip_level是用户等级,等级越高则说明成交数越多。
买家表 buyers (buyer_id, create_time, vip_level),其中buyer_id是买家用户id, create_time是注册时间,vip_level是用户等级,等级越高则说明成交数越多。
订单表 orders (order_id,buyer_id, seller_id,create_time, pay_time, success_time, product_id, price) 订单id, 买家id,卖家id, 创建时间,支付时间,交易完成时间,商品id,
商品价格。
1) 你能否找到满足以上特征,创建订单在20150201当天存在刷单嫌疑的买家和卖家吗(提供sql语句)?
2) 请用一个SQL语句,统计出20150201当天付款金额最高的买家用户id、付款笔数最多的买家用户id
3) 用一段SQL分析下20150201当天成交额最高的卖家,在之前一个月和之后一个月每天成交额情况。以买家付款时间作为成交时间。
这个题目折腾了死我了, 虽然有了思路但是 还是折腾我3 个小时。 思路就不写了, 感觉最后一张表 有问题的,貌似订单中只能有一个商品, 但实际中的确不只是一个商品的。
估计出题目的人 折腾我们吧, 题目的意思是 几条记录就几个商品。 总结写结果 以后自己多看看
1 select buyer_id, seller_id from orders o where success_time='20150201'
exits ( select 1 from buyers s create_time <= '20150201' and create_time>='20150125' and vip_level<=2 and s.buyer_id = o.buyer_id); 按照题目意思写的 就算有问题 问题也不太, 效率上面需要考虑的, 实在不行 用hints 强制走 hash 连接
2 就是这个题目折腾人!
select max(total), max(cnt),
max(buyer_id) keep(dense_rank first order by total desc), --- 成交额 最多
max(buyer_id) keep(dense_rank first order by cnt desc) -- 成交的数量最多
from(
select count(1), product_id, price, buyer_id,
sum( count(1)*price ) over(partition by buyer_id) total, ---- 成交的金额
sum(count(1)) over(partition by buyer_id) cnt ---- 成交的数量
from orders -- where success_time='20150201'
group by product_id, price, buyer_id
); 测试通过.........
3 第三个简单写写
with tab1 as( --- 计算出 当天谁最多
select count(1) cnt, product_id, price, buyer_id, sum( count(1)*price ) over(partition by buyer_id) total ---- 成交的金额
from orders where create_time='20150201' group by product_id, price, buyer_id
) select buyer_id from tab1 where cnt*price = total
select sum(cnt*price), time from (
select count(*) cnt, product_id, price, substr(create_time, 1,8 ) time from orders where (pay_time like '201503%' or pay_time like '201501%') group by substr(create_time, 1,8 ) , product_id, price
) group by time
需要把 第一步的 结果放入到 第二步中当条件