通过数据库取数-数据库怎么给表取别名

大家好,我是数据小郑。

本篇是数分必会mysql系列通过数据库取数的第六篇:日常取数100例(三)。

系列内容,请看【数分必会mysql】话题,订阅后文章更新可第一时间推送至订阅号。

mysql的基础点在1、2、3已经总结过了,接下来准备更新日常取数100例,在实际业务场景中熟练取数技能。案例均取自热点面试题和真实工作场景。

文章分为3部分,第一部分为业务取数分析,第二部分为代码取数和结果展示,第三部分为代码逻辑简述。

通过数据库取数

业务取数需求

在 *** 员工绩效过程中,我们需要维护自己的基础数据库的准确性。今天主要分享一例资源分配底表维护的案例。

资源分配表如下:一个合同会在不同负责人之间流转,譬如0001合同会在6月1号分给aa负责到10号,但是由于业务变动或者合同变动0001合同在6月5号又分给了ee,初步给到的负责时间是6月5号-6月20号。因此0001号合同在aa负责人的周期应该改为20210601-20210604,在ee负责人的周期应该改为20210605-20210610。

通过数据库取数

通过数据库取数

代码取数

解法:

select a.合同,a.合同负责人,a.beg_day,(case when b.begday>a.begday and b.begday<=a.endday then date_format(date_add(b.begday,interval -1 day),'%Y%m%d') when b.begday is null then a.end_dayend) as endday from (select *,date_format(beg_day,"%Y-%m-%d") as begday,date_format(end_day,"%Y-%m-%d") as endday,rank() over (partition by 合同 order by beg_day asc) m1from xx_list) as a left join(select *,date_format(beg_day,"%Y-%m-%d") as begday,date_format(end_day,"%Y-%m-%d") as endday,rank() over (partition by 合同 order by beg_day asc) m2from xx_list) as b on a.合同=b.合同 and a.m1=b.m2-1 ORDER BY 合同;通过数据库取数

通过数据库取数

逻辑简述

清单中合同号不是唯一的,会随着begday的变化变化合同负责人,所以我们以以合同号分组根据begday排序,这样合同号结合序号就是唯一值,可以作为主键使用。然后根据主键左连接得到如下数据:

通过数据库取数

我们会发现:当beg_day(1)不为空时,我们需要使用case when 判断修改end_day使之符合实际负责时间通过数据库取数;当beg_day(1)为空时,我们直接保留原begday和endday就好。

总结:

1.本篇取数内容主要使用date_format,case when,date_add和窗口排序函数

2.自联接的思想。

原创不易,欢迎点赞、留言、分享,支持我继续写下去

通过数据库取数

我是数据小郑,最近正在原创数分必会mysql系列话题,欢迎订阅。订阅后,文章更新第一时间推送至订阅号,每篇文章不错过。

发布于 2024-05-16 17:05:07
收藏
分享
海报
0 条评论
72
目录

    0 条评论

    本站已关闭游客评论,请登录或者注册后再评论吧~