一個SQL語句 反應高效率工作的例子
今天運營側需要一個遊戲消費資料,BOSS讓我寫個指令碼幫忙查一查。拿到需求想了想,寫了個複雜的SQL,將輸出重定向了一下。算上匯出到Excel整個過程不到10min,感覺棒棒噠
-
需求描述:
需要2018-07-26日各個渠道新創角角色在2018-07-26到2018-08-02各天的消費資料,消費資料按天彙總。
-
已知條件:
1、表 cp_new_role_2018 中包含 新角色資訊roleId,每個角色會標記渠道來源adId
2、表 channel_info 包含渠道資訊,即adId的名稱等
3、表 cp_recharge_2018 包含消費資訊。
(所有表名,欄位名均為別名)
-
於是有query sql:
use database1; select count(distinct tb1.roleId) as payRoleCount,tb1.adId,tb2.name,left(tb3.createTime,10), sum(tb3.orderMoney) from cp_new_role_2018 as tb1 left join database2.channel_info as tb2 on tb1.adId = tb2.id right join database1.cp_recharge_2018 as tb3 on tb1.roleId = tb3.roleId and tb1.adId = tb3.adId where tb1.createTime >= '2018-07-26' and tb1.createTime < '2018-07-27' and tb3.createTime >= '2018-07-26' and tb3.createTime <= '2018-08-03' group by left(tb3.createTime,10),tb1.adId
思路說明:
1、先將表cp_new_role_2018通過外來鍵adId和表channel_info右連結獲取adId對應的名稱。
即SQL: Select tb2.name from cp_new_role_2018 as tb1 left join database2.channel_info as tb2 on tb1.adId = tb2.id
2、 將表cp_new_role_2018 2018-07-26日的roleId 和 消費表cp_recharge_2018 2018-07-26日 到 2018-08-03日的roleId進行右連結
即SQL:Select sum(tb3.orderMoney), left(tb3.createTime,10) from cp_new_role_2018 as tb1 right join database1.cp_recharge_2018 where on tb1.roleId = tb3.roleId where tb1.createTime >= '2018-07-26' and tb1.createTime < '2018-07-27' and tb3.createTime >= '2018-07-26' and tb3.createTime <= '2018-08-03'
3、已 日期(createTime)和渠道(adId)將結果分組聚合,由於時間原資料都是精確到秒,所以取做字首10個字元即為當日日期
即SQL: ... group by left(tb3.createTime,10),tb1.adId
得到結果如圖:
結果說明:獲取2018-07-26的各個渠道(adId)的新角色在2018-07-26到2018-08-02各天的消費資料,按渠道和天彙總
然後用sql命令將結果輸出重定向到txt中,最後將txt複製成excel
輸出重定向命令如下:
mysql -h127.0.0.1 -uroot -p123456 -P3306 -e "use database1; select count(distinct tb1.roleId) as payRoleCount,tb1.adId,tb2.name,left(tb3.createTime,10),sum(tb3.orderMoney) from cp_new_role_2018 as tb1 left join database2.channel_info as tb2 on tb1.adId = tb2.id right join database1.cp_recharge_2018 as tb3 on tb1.roleId = tb3.roleId and tb1.adId = tb3.adId where tb1.createTime >= '2018-07-26' and tb1.createTime < '2018-07-27' and tb3.createTime >= '2018-07-26' and tb3.createTime <= '2018-08-03' group by left(tb3.createTime,10),tb1.adId" > /data/file/temp_mysql20180808.txt
將得到的txt檔案直接複製到excel,即可得到需求方需要的excel版資料,如下圖
原本1個小時的事情,幾分鐘搞定啦