• 常用的函数-MySQL


    1.截取日期中的年月日

    1. SELECT DATE_FORMAT('2022-09-20 18:24:20', '%Y%m%d')
    2. FROM dual;

    格式化输出类型含义
    %Y输出年份:2022
    %m输出月份:09
    %d输出日:20

    2.计算某个日期之后几天或者之前几天

    1. SET @dt = NOW();
    2. SELECT @dt FROM DUAL;
    3. SELECT DATE_ADD(@dt, INTERVAL 3 DAY) FROM DUAL; # 当前日期+3
    4. SELECT @dt FROM DUAL;
    5. SELECT DATE_ADD(@dt, INTERVAL -1 DAY) FROM DUAL; # 当前日期-1

    当前日期+3

    当前日期-1

    笔试题

    题目: 表字段:pay_date(日期)、user_id(用户id)、user_type(用户类型)、amount(消费金额)。

    表名:table_name

    • 问题一:每天每类用户的总消费金额;
    • 问题二:每天每类用户的消费增长率(与3天前(pay_date - 3)的消费金额做对比);问题二需要返回的列:pay_date,user_type,amount,amount_new(3天前金额),amount_rate(增长率)。

    分析:

    • 问题一:考察分组函数(Group By)的使用
    • 问题二:考察等值连接(内连接)的使用,以及日期+天数需要使用到的函数,以及根据日期提取日期中的年、月、日的函数的使用。

    问题一比较简单,问题二也不难,但是稍微有些麻烦。

    具体考点如下:

    • 内连接

    内连接(我们可以称为是等值连接),当表a 内连接 表b 时,需要使用 ON 表名连接的条件,不符合该条件的表a和表b中的其他记录都不显示,只显示表a和表b中满足 ON 后面的条件的记录。具体语句如下:

    1. select 字段1, 字段2
    2. from 表a
    3. inner join 表b
    4. on a.字段1 = b.字段2;

    内连接的inner咱们统一不省略,以上是内连接的使用方法,这是标准的SQL语法形式。以下是一种不标准的书写形式,比较简洁,如下:

    1. select *
    2. from 表a,
    3. 表b
    4. where a.字段1 = b.字段2;

    这种方法不是标准的SQL,虽然简洁,不是不建议写了,两者得到的答案是一样的。

    建表

    首先,我们根据题意先建立 t_user 表,代码如下:

    1. CREATE TABLE `t_user` (
    2. `order_id` int(10) AUTO_INCREMENT NOT NULL COMMENT '订单ID',
    3. `pay_date` datetime NOT NULL COMMENT '支付日期',
    4. `user_id` int(10) COMMENT '用户id',
    5. `user_type` int(10) COMMENT '用户类型',
    6. `amount` int COMMENT '消费金额',
    7. PRIMARY KEY (`order_id`)
    8. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
    9. DROP table `t_user`;

    插入测试数据

    然后,我们插入测试数据:

    1. insert into `t_user`(`pay_date`, `user_id`, `user_type`, `amount`) values
    2. ('2022-09-01 18:25:26', 10001, 01, 800),
    3. ('2022-09-01 15:20:26', 10002, 02, 200),
    4. ('2022-09-02 14:20:10', 10001, 01, 2000),
    5. ('2022-09-03 12:10:02', 10003, 03, 100),
    6. ('2022-09-02 20:10:18', 10001, 01, 500),
    7. ('2022-09-04 18:25:26', 10001, 01, 800),
    8. ('2022-09-05 15:20:26', 10002, 02, 200),
    9. ('2022-09-06 14:20:10', 10005, 01, 2000),
    10. ('2022-09-07 12:10:02', 10003, 03, 100),
    11. ('2022-09-08 20:10:18', 10004, 01, 500);

    测试数据查询结果如下:

    t_user表

    问题一

    MySQL代码如下:

    1. SELECT
    2. DATE_FORMAT(pay_date, '%Y%m%d') AS pay_date,
    3. user_type,
    4. sum(amount) all_amount
    5. FROM
    6. `t_user`
    7. GROUP BY
    8. DATE_FORMAT(pay_date, '%Y%m%d'),
    9. user_type;

    根据 日期年月日(DATE_FORMAT(pay_date,'%Y%m%d')) 和 user_type进行分组查询聚合即可。

    结果如下:

    问题一得到的答案

    问题二

    1. WITH
    2. tt
    3. AS(
    4. WITH t AS (
    5. SELECT
    6. DATE_FORMAT(pay_date, '%Y%m%d') AS pay_date,
    7. user_type,
    8. sum(amount) all_amount
    9. FROM
    10. `t_user`
    11. GROUP BY
    12. DATE_FORMAT(pay_date, '%Y%m%d'),
    13. user_type
    14. ) SELECT
    15. t1.pay_date curr_pay_date,
    16. t2.pay_date before_pay_date,
    17. t2.user_type,
    18. t1.all_amount curr_amt,
    19. t2.all_amount before_amt
    20. FROM t AS t1
    21. INNER JOIN t AS t2
    22. ON DATE_FORMAT(DATE_ADD(t1.pay_date, INTERVAL - 3 DAY), '%Y%m%d') = t2.pay_date
    23. )
    24. SELECT
    25. curr_pay_date,
    26. before_pay_date,
    27. user_type,
    28. curr_amt,
    29. before_amt,
    30. ROUND((curr_amt-before_amt)/before_amt, 2) gorw_rate
    31. FROM tt;

    第二问需要使用到第一问的结果,第一问的结果如下:

    问题二要求我们求解:每天每类用户的消费增长率(与3天前(pay_date - 3)的消费金额做对比);

    分析这个题目:

    • 我们根据第一问已经求出每天每类用户的信息,我们把它建立为临时表;
    • 要求解3天前的 pay_date-3 (可以使用把问题一的表格数据和本表进行连接,连接条件是pay_date-3 和 pay_date);

    自身进行连接

    需要掌握两个函数:

    • DATE_ADD(t1.pay_date, INTERVAL - 3 DAY) :得到的答案形如:20220901
    • DATE_FORMAT(pay_date, '%Y%m%d') : 得到的答案形如:2022-09-01

    以上完成之后该问题就迎刃而解了。

    如何使用Python语言解决上述题目?

    • 问题一:每天每类用户的总消费金额;
    • 问题二:每天每类用户的消费增长率(与3天前(pay_date - 3)的消费金额做对比);问题二需要返回的列:pay_date,user_type,amount,amount_new(3天前金额),amount_rate(增长率)。

    对于这道题目,我们使用Python语言该怎么处理哪?

    问题一比较好写,使用pandas直接操作即可:

    1. import numpy as np
    2. import pandas as pd
    3. data = pd.DataFrame([['20220101', '10001', '01', 3000.],
    4. ['20220101', '10002', '02', 500.],
    5. ['20220102', '10002', '02', 200.],
    6. ['20220102', '10002', '02', 100.]], columns=['pay_date', 'user_id', 'user_type', 'amount'])
    7. print(data)
    8. res = data.groupby(by=['pay_date', 'user_type']).sum()
    9. print(res)

    对于问题二:

    遇到的问题就是日期移位使用那个方法?经过查找资料我们使用如下方法:

    print(pd.to_datetime('20220103', format='%Y%m%d') + pd.Timedelta(days=-3))   # 移位日期

    执行结果

    SQL里的分组和连接的功能,分别对应于pandas中的groupby()和merge()函数,具体如下:

    1. import numpy as np
    2. import pandas as pd
    3. data = pd.DataFrame([[pd.to_datetime('20220101'), '10001', '01', 3000.],
    4. [pd.to_datetime('20220101'), '10002', '02', 500.],
    5. [pd.to_datetime('20220102'), '10002', '02', 200.],
    6. [pd.to_datetime('20220102'), '10002', '02', 100.],
    7. [pd.to_datetime('20220103'), '10002', '02', 400.],
    8. [pd.to_datetime('20220104'), '10002', '02', 200.]], columns=['pay_date', 'user_id', 'user_type', 'amount'])
    9. print(data)
    10. res = data.groupby(by=['pay_date', 'user_type']).sum() # 使用groupby进行分组
    11. print(res)
    12. # 使用merge进行2个表的连接
    13. print(data.merge(data, left_on=data['pay_date']+pd.Timedelta(days=-3), right_on='pay_date'))

    表成功进行了连接

    数据分析有哪些方法

    1、对比分析法 :常用于对纵向的、横向的、最为突出的、计划与实际的等各种相关数据的。例如:今年与去年同期工资收入的增长情况、3月CPI环比增长情况等。


    2、 趋势分析法:常用于在一段时间周期内,通过分析数据运行的变化趋势(上升或下降),为未来的发展方向提供帮助。例如:用电量的季节性波动、股市的涨跌趋势等。


    3、 相关分析法:常用于分析两个或多个变量之间的性质以及相关程度。例如:气温与用电量的相关性、运动量大小与体重的相关性等。


    4、 回归分析法:常用于分析一个或多个自变量的变化对一个特定因变量的影响程度,从而确定其关系。例如:气温、用电设备、用电时长等因素对用电量数值大小的影响程度、工资收入的高低对生活消费支出大小的影响程度等。


    5、 描述性分析法:常用于对一组数据样本的各种特征进行分析,以便于描述样本的各种及其所代表的总体的特征。例如:本月日平均用电量、上海市工资收入中位数等。


    6、结构分析法 :常用于分析数据总体的内部特征、性质和变化规律等。例如:各部分用电量占总用电的比重、生活消费支出构成情况等。

    总结

    整体来说,笔试题第一问相对简单,第二问也不是太难,中间使用到的部分MySQL的函数要进行单独记忆,毕竟考试是不让百度的,不忘初心,砥砺前行。

    【每日一记,防止忘记】

  • 相关阅读:
    math_消除根式:椭圆的标准式方程推导&坐标系平移&整理多项式
    视频翻译字幕的软件哪个好?看完你就知道了
    已解决javax.transaction.InvalidTransactionException:事务无效的正确解决方法,亲测有效!!!
    【优化模型】求有约束的多元函数最小值
    canvas保存画笔的状态到栈里面
    拒绝水文!八大排序(三)【适合初学者】快速排序
    PAN3020 Sub-1G无线收发芯片
    大型连锁百货运维审计用什么软件好?有哪些功能?
    什么是自动化测试框架?常用的自动化测试框架有哪些?
    JNPF开发平台凭什么火?
  • 原文地址:https://blog.csdn.net/y_h_k_666/article/details/127120601