1. sql部分
-
插入多条记录的语句
INSERT INTO house_info (`house_id`, `hold_ucid`, `del_type`, `hold_shop_code`) VALUES ('24', '9904', '二手', '1004'), ('25', '9905', '二手', '1005'), ('26', '9906', '新房', '1006'), ('27', '9907', '新房', '1007'), ('28', '9908', '新房', '1008');
-
插入店铺信息表
INSERT INTO shop_info (shop_id, area) VALUES ( 1001, '宝安'), ( 1004, '南山'), ( 1005, '南山'), ( 1006, '宝安'), ( 1007, '南山'), ( 1008, '龙岗');
-
先看看两个表的样子
-
表格连接外加分类汇总
select a.area, sum(if(b.del_type='二手', 1, 0)) as 二手房源量, sum(if(b.del_type='新房', 1, 0)) as 新房房源量 FROM shop_info a inner join house_info b on a.shop_id = b.hold_shop_code group by a.area;
-
看一看电话的表格的基本的样子
我们发现里面有很多是重复的,所以需要考虑的是最后一次的接通。最后一次的接通在30天以外或者根本没有接通过。
1.1 先把最后一次的接通数据找出来
select house_id, max(tele_date) -- max得到的肯定就是最后一次 from telephone_info where is_connected = 1 group by house_id;
然后拿着这个表和house_info ,左连接,然后再筛选里面的30天开外的和NULL的。
with temp AS (select house_id, max(tele_date) as last_call from telephone_info where is_connected = 1 group by house_id) select a.house_id, date_format(last_call, '%Y-%m-%d') as 电话拨打时间 -- date_format 设置格式。。 from house_info a left join temp b on a.house_id = b.house_id where (DATEDIFF(now(),last_call) > 30) or (last_call is NULL);
2、python基础
1.下面这段代码的输出结果是什么?请解释
def extendList(val,list=[]):
list.append(val)
return list
list1 = extendList(10)
list2 = extendList(123,[])
list3 = extendList('a')
print("list1 = %s" %list1)
print("list1 = %s" %list2)
print("list1 = %s" %list3)
[10] 因为list没有传入
[123] 因为list传入的是空的
-
['a'] 因为没有传入list
实际的答案竟然是
原因在于多次调用默认参数的时候,默认的那个list参数竟然是同一个,然后list又是可变类型的变量,所以直接在变量身上就地修改了。
2.
2.1下面这段代码输出什么?
num = 9
def f1():
num = 20
def f2():
print(num)
f2()
f1()
f2()
9
9
需要global标记才能是这个变量引用全局的变量
2.2在以上代码的基础上如何进行修改使得
def f1():
global num
num = 20
输出结果为:
9
20
2.3以下两段代码运行之后结果是否相同?为什么?
第一段:
l=[]
for i in range(10):
l.append({'num':i})
print(l)
第二段:
l=[]
a={'num':0}
for i in range(10):
a['num']=i
l.append(a)
print(l)
一个结果 是
[{num:1}, {num:2},{num:3},{num:4},...]
另一个的结果是
[{num:9}, {num:9},{num:9},{num:9},...]
3、python进阶
1.python的传参是传值还是传址
引用
2.如何判断同一个DataFrame中的一列是否包含另一列的元素(举例说明)
生成的代码
import pandas as pd
import numpy as np
s1 = pd.Series(list('ABCDEF'))
s2 = pd.Series(list('EFGHIJ'))
df = pd.DataFrame({'key1':s1, 'key2':s2})
df
判断的代码,用类似sql中自关联
merged = pd.merge(df, df, left_on='key1', right_on='key2')
print(merged)
print("有交集吗={}".format(merged.shape[0] > 0))
3.尝试将以下SQL语句功能用Pandas表达(提示:结合DataFrame的GROUP BY、agg、filter函数)
SELECT user_id, buy_month, mean(price), sum(pro_count)
FROM sales_tab
WHERE sex='male'
GROUP BY user_id, buy_month
HAVING count(*) > 1 # 只考虑当月购买次数多余1 的情况
3.1 原始数据
df = pd.DataFrame({'user_id':[1, 2, 3, 2, 3] ,
'buy_month':[1, 2, 2, 2, 2],
'sex':['male', 'male', 'male', 'male', 'male'],
'price':[1, 2, 3, 4,5],
'pro_count':[1, 1, 1, 1, 1]
})
df
3.2 where字句 与loc对应
# 相当于where
df = df[ df.sex=='male']
df
3.3 groupgy等价
# group by
groups = df.groupby( ['user_id', 'buy_month'])
groups.size()
3.4 聚合函数等价于agg
# agg 相当于sql的聚合函数
month_agg = groups.agg({ 'price':'mean', 'pro_count':'sum', 'user_id':'count', 'buy_month':'count'})
month_agg_renamed = month_agg.rename(columns = {'price':'某人某月购买商品的平均价格', 'pro_count':'某人某月一共买了几件', 'user_id':'某人某月发生几次购买'})
month_agg_renamed
3.5 loc再次筛选相当于having
# 针对汇总的字段 再做一次筛选就相当于 sql中的having
month_agg_renamed[ month_agg_renamed['某人某月发生几次购买']>1]