阿里幾乎所有的訂單系統的排名都會參考成交量(交易成功)這個指標,因此很多賣家為了使自己的排名靠前,不惜利用刷單行為來提高自己的排名(即虛假成交),如果現在發現虛假刷單的特徵其中一點:即低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當天成交額最高的賣家,在之前乙個月和之後乙個月每天成交額情況。以買家付款時間作為成交時間?
分析:為了簡化時間,設當天時間就是20150201,此外這裡,視訂單支付時間,交易完成時間統一為訂單建立時間,即訂單建立即支付成功,雖然實際中有不妥,但是此處為簡化語句,到時自要替換相應的時間查詢欄位就可以了。
問題1:
(1)select * from orders where trunc(create_time)=to_date('2015-2-1','yyyy-mm-dd');--獲得20150201當天的訂單,下一步當成子表查詢;
(2)select a.buyer_id,count(*) from (select * from orders where trunc(create_time)=to_date('2015-2-1','yyyy-mm-dd')) a inner join buyers b on a.buyer_id=b.buyer_id whereround(to_number(to_date('2015-02-01','yyyy-mm-dd')-b.create_time))<=5 and b.vip_level<=2 group by a.buyer_id;
分析:藍色部分為條件,其中round()函式用於時間表示,具體的可以參考這裡邊設計oracle的時間函式,比較全面。然後把滿足條件的buy_id進行分組,並統計出當天的購買次數,次數最多的存在很大可能性的刷單嫌疑。
問題2:
獲得付款筆數最多的買家使用者id?
(1)select buyer_id,count(*) times,sum(price) total from orders where trunc(create_time)=to_date('2015-2-1','yyyy-mm-dd') group by buyer_id;--以使用者分組,統計每個使用者當天的付款筆數,以及成交總額。
(2)select max(times) from(select count(*) as times,buyer_id from orders where trunc(create_time)=to_date('2015-2-1','yyyy-mm-dd') group by buyer_id);--取得當日付款最多的筆數為幾筆。
(3)select buyer_id from(select count(*) as times,buyer_id from orders where trunc(create_time)=to_date('2015-2-1','yyyy-mm-dd') group by buyer_id) where times=(
select max(times) from(select count(*) as times,buyer_id from orders where trunc(create_time)=to_date('2015-2-1','yyyy-mm-dd') group by buyer_id) )--利用第二步取得最多的筆數作為子條件,獲得最終的買家id。
獲得付款金額最高的買家使用者id?
(1)select max(total) from (select buyer_id,sum(price) as total from orders where trunc(create_time)=to_date('2015-2-1','yyyy-mm-dd') group by buyer_id)--取得當天付款最高的金額
(2)select buyer_id from(select buyer_id,sum(price) as total from orders where trunc(create_time)=to_date('2015-2-1','yyyy-mm-dd') group by buyer_id) where total= (
select max(total) from (select buyer_id,sum(price) as total from orders where trunc(create_time)=to_date('2015-2-1','yyyy-mm-dd') group by buyer_id) )--利用第一步取得當天付款最高的金額作為查詢條件,查詢出對應買家的id;
問題3:
分析:目前本人只有一種分析思路,其它還望各位大神提點:
select create_time,sum(price) from (select * from orders where buyer_id='2000054305' and create_time between to_date('2015-1-1','yyyy-mm-dd') and to_date('2015-3-1','yyyy-mm-dd')) group by create_time
---此處涉及到的知識就是時間的間隔了,between and以及to_date將字元按指定規則轉換成日期。
好的,大功告成,本人oracle初學者,相信以上語句問題可以解決,但效能方面尚且不知,相信會有更優語句,此外,紅色部分標註為子查詢部分。
阿里巴巴2016研發工程師筆試題(四)
1.以下程式輸出結果是 class a virtual void func 本問題涉及到兩個方面 1.c 繼承體系中建構函式的呼叫順序。2.建構函式中呼叫虛函式問題。c 繼承體系中,初始化時建構函式的呼叫順序如下 1 任何虛擬基類的建構函式按照他們被繼承的順序構造 2 任何非虛擬基類的建構函式按照他...
阿里巴巴 2018秋招研發工程師筆試題
2.菜鳥倉庫是乙個很大很神奇的地方,各種琳琅滿目的商品整整齊齊地擺放在一排排貨架上,通常一種品類 sku 的商品會放置在貨架的某乙個格仔中,格仔設有統一的編號,方便工人們揀選。有一天沐哲去菜鳥倉庫參觀,無意中發現第1個貨架格仔編碼為1,第2 3個分別為1,2,第4 6個格仔分別是1,2,3,第7 1...
阿里巴巴研發工程師C 實習面經
這是我寫的第一篇面經,也是第乙個面試,疫情期間直接 面試,面試的小哥也很溫柔,在這裡要說明一點 投完簡歷以後一定要一直開著手機鈴聲,千萬不要靜音,還好小哥後來又給我打了一次 接到了不然就錯過了。寫這篇的目的是為了以後方便自己複習,也供參考 首先介紹一下本人情況 研一在讀,985非top9,本校保研公...