阿里幾乎所有的訂單系統的排名都會參考成交量(交易成功)這個指標,因此很多賣家爲了使自己的排名靠前,不惜利用刷單行爲來提高自己的排名(即虛假成交),
如果現在發現虛假刷單的特徵其中一點:即低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
需要把 第一步的 結果放入到 第二步中當條件