SQL編程題 數據庫開發工程師



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

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章