sql left join on 多条件_记一次百行级sql的拆解和分析 附心得体会

de99e58a254eff2d002d7189a9b6d531.png

最近一直在想做关于SQL的应用案例,这周刚好看到Github上关于天池算法大赛上,菜鸟需求预测与分仓分析,看了【队名:左手诗句,右手数据】排名第一的数据处理过程,受益良多,想着把自己的拆解过程写下来,供初学者一起参考学习。

​这个sql有340行,26KB。有兴趣的同学可以在我的文章《菜鸟需要与分仓分析SQL语句》中进行查看。

704fcb97a90bc1a9acf82d59d4018393.png

表1:标签

f975741975287165ef2d67491fc18716.png

我们先捋一下整个SQL的结构,其中left outer join为表与表的连接语句,把表分成以下几个部分。

表2-15:最近1天--最近14天

45627548fd2973f7d3fc2116013ac3ad.png

表16:item_id为首列,非聚划算的最大,最小,标准差。

ab48b70088907d8542cdba969cc40298.png

表17:item_id为首列,连接起以下各个类型特征

4056008d392e262f1ab89964803696f2.png

表18:叶子类特征

146ffc8ecf70d90a58e171b0432fd0ad.png

表19:大类目特征

ec46a9966b7cdcaa5d36cabcbfaff292.png

表20:品牌特征

7d90f9289f9ec4d7009765975c445a01.png

表21:供应商ID特征

43b4389c57754ea3515aec6051013f2f.png

特别要说的是表21最后这个 k on(a.item_id=k.item_id),连接起了表17到表21,非常重要。

总结:

一:由于我用pandas较多,从没想过mysql还能这么用,mysql在构建特征时,很高效,我曾想着用pandas 也能做,当然,我试了,是可以,同样对一item_id进行groupby后,使用agg复合函数,就像这样:

比如调用day_1的数据:

daaaf039e3d02655ae666b087b4b9256.png

d84e66df1a7a6b006a964e190da3f228.png

我们能看到,即使有agg的复合函数,虽然同样能实现这样的功能要求,但在列的命名上,不够灵活。如果每次执行的列名都是变化的,比如这里,反复的对列进行sum(),mean(),还要求列名重命名,即使可以使用(lambda:x+"_1" for x in columns)但调用14次,但也是非常低效的,而mysql一句 select sum(pv_uv)as pv_uv_sum,非常灵活。

二:另外一点,对两个表以上的聚合,merge,concat有了更深的理解,比如这里

8a15f6af39ecbc4e630d33f3506b53b3.png

pd.concat()可以对多个dateframe进行聚合,但它只能选择对axis=0或者axis=1 也就是按列或者按行,进行聚合。

pd.concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False,
       keys=None, levels=None, names=None, verify_integrity=False)

参数说明
​objs: series,dataframe或者是panel构成的序列lsit
axis:需要合并链接的轴,0是行,1是列
join:连接的方式 inner,或者outer

它没有可以选择聚合的关键连接列,即缺少on这个关键列。

而pd.merge(),是可以选择聚合的关键连接列

pd.merge(left, right, how=’inner’, on=None, left_on=None, 
right_on=None, left_index=False, right_index=False, sort=False,
 suffixes=(‘_x’, ‘_y’), copy=True, indicator=False, validate=None)

所以,结论是,如果两个表的结构相同,而且是只想做上下的叠加,或者左右的叠加,对index列没有要求删除,那么可以用concat,但如果是两个表之间的join,用pd.merge()。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值