被打倒一次,你站起來了;兩次,你又站起來了。我相信你能做到!可百次呢?千次呢?最近一直在刷一些資料分析的筆試題,在網易2020的校招題目中看到這樣一道sql題:
使用者第一單購買的行為往往反映了使用者對平台的信任度和消費能力。現在資料庫中有一張使用者交易表order,其中有userid(使用者id)、amount(消費金額)、paytime(支付時間),請寫出對應的sql語句,查出每個使用者第一單的消費金額。筆者在網上看到了一些解答,但是總覺的有瑕疵,於是就自己建了表,用my sql測試了一下,發現了一些容易被忽略的地方,分享給大家。
知道order表有3個字段:userid、amount、paytime,求出每個使用者第一單的消費金額。筆者稍微研究了一下就得出了乙個答案。邏輯:先找出每個使用者第一單的消費時間,然後對應userid和paytime匹配相應的amount即可。
示例1:(有瑕疵版)
select o.userid,o.amount,ump.mp
from
(select userid,
min(paytime)
as mp from use_order group
by userid)
as ump
join user_order as o on ump.mp=o.paytime order
by userid;
這是我建立的表user_order如下:
由於order與sql的排序語句重疊,所以我新建的表名字其實是user_order。
這是查詢結果:
瑕疵就是,如果不同使用者的paytime有相同的,那麼就會出現這種問題。userid = 2的使用者出現了兩個記錄,是不對的。(在實際業務中,訂單的paytime按照時間戳自動生成,肯定是不會出現這種有重複時間的問題。而且實際使用中,表肯定是有主鍵的,主鍵是不會重複的。)
示例2:使用兩個連線條件
所以在連線兩個表的時候就不能僅僅看paytime這乙個字段,還要結合userid欄位,略微調整一下sql語句:
select uo.userid,uo.amount,ump.mp
from
(select userid,
min(paytime)
as mp from user_order group
by userid)
as ump
join user_order as uo on ump.mp=uo.paytime and ump.userid=uo.userid order
by userid;
輸出結果如下:
示例3:使用where條件
同樣的效果也可以使用where條件語句達到:
如何獲取使用者和手機的資訊
在我們寫程式的時候,經常需要知道誰在使用這個程式或者說是程式執行在什麼樣的手機上。相比之前使用.net cf來開發windows mobile系統上的應用程式來說,windows phone 7中提供的api就方便多了。1.2.然後我們可以通過microsoft.phone.info命名空間下的兩個...
Android 獲取使用者安裝的app資訊
在電子市場類軟體中,管理應用程式要獲取已經安裝的應用程式列表,下面提供兩種方法,參考了 方法三 可以通過uid來過濾系統系統的安裝包,因為android系統中的uid從 1000 9999 都是給系統程式保留的,所以只要判斷package的uid 10000即可判定該程式是非系統程式。12 if10...
iOS 獲取使用者位置資訊的 預處理
在info.plist 新增 可以通過配置 nslocationalwaysusagedescription nslocationwheninuseusagedescription來告訴使用者使用定位服務的目的 一直 當使用者使用時 設定地圖 void setmap if cllocationman...