mysql练题笔记-连接-每台机器的进程平均运行时间

leecode高频sql50题(基础版)-每台机器的进程平均运行时间

一、理解题意:

表结构和题目如下:

08977e5873c74afa8c7d079df9bfbdb2.png

参考例子如下(我觉得参考例子挺重要的,帮我理解了题目):

7073b19dd4eb4fed9b40b8f65f3508df.png

fbe6640389dc408d835ad51f265601b2.png

初步想法:

有不同的机器,机器里有不同的进程,需要计算每个进程的开始时间和结束时间之差也就是运行时间的总和除以进程个数的值,也就是每个机器的进程的平均运行时间。

我初步的设想是算出工厂里的进程个数,但是不知道怎么算

目前只知道select machine_id,processing_time from

但是又有一个问题,这个processing_time是一个别名,而且是查询平均时间后的,最后又需要作为查询结果,这个理不太清。

那这样select machine_id,(select 。。。。。)as processing_time from 好像行。

二、理解题解:

我看题解确实是我上面想的思路,然后我觉得我有能力看两个答案了,嘿嘿,于是我尝试理解两个答案:

1.第一个答案如下(第一个很好理解但是也有不知道的点):

1.第一个题解不理解的点记录如下

1)自连接 (join on)

之前只知道内连接,外连接,全连接(mysql还没有),百度了一下自连接,百度的结果非常理解

自连接是内连接的一种,内连接可分为等值连接和 自身连接 。

等值连接:查找两个表中连接字段相等的记录。

自身连接:就是和自己进行连接查询 ,给一张表取两个不同的别名,然后附上连接条件。

注:附上连接的条件,我的理解是你没必要把两张表一模一样的连在一起,这毫无意义,所以根据你想要的限制条件,将不同别名的表进行限制,筛选出来的一个虚拟的表。

2)avg()

这是返回表达式的平均值,这么平易近人的函数吗,我在书里都没看见,哈哈哈。

其实还是要细细的理解的,是把参数每个存在的值取出来相加,除以值的个数。

0f13989d2e87455882f06620ec3575b8.png

注:我发现这个网站(https://www.begtut.com/)还挺好用的,说的很简便,很好让人理解啊

32c0f6e65b5a41dea3dc140aaa532b22.png

3)round函数

四舍五入的函数啊,哈哈,也很平易近人啊。

acca561ef26d46d68874e1fe3b53ac15.png

4)发现group by之前理解的不是很好

首先记住group by后面接的是字段

这里的group by是对于两个不同别名的表都进行分组吗 总感觉不对

我觉得group by的还是一张表(自连接后的加上限制条件就是一张表)的字段,

上面的自连接后的限制条件是把两张不同别名的表作为一张表,而且from后面本质还是得一张表

运行第一个题解的总结:

最后用就是给的题解,不知道为啥都背下来了,哈哈哈,一次通过,不过运行时间很长哈,打败了5%用户果然需要改正

2.第二个题解

22aad0d9b9784fe6b358cb748c894e6c.png

注意点:适用的是每个start都有end,且每个end都有start的情况,这里我没有加else null

我自己是用了以下的代码

select machine_id,round(sum(case when a.activity_type='start' then -timestamp when a.activity_type='end' then +timestamp end)/count(distinct process_id),3) as processing_time from Activity a group by machine_id;

运行时间:

这个运行时间很棒啊,打败了71.09%的用户,说明avg用时挺长的啊

3.第三个题解

本来说只看两个题解的,嘿嘿。

028adc6bae1342ddb585d361d7d466f5.png

注意点:

(1)*2放在if函数外还是avg函数外都是一样的,因为本质就是结果除以2,是先还是后没有区别,如下也行。

select machine_id,round(AVG(IF(a.activity_type='start',-timestamp,+timestamp)*2),3) as processing_time from Activity a group by machine_id;

(2)适用的是每个start都有end,且每个end都有start的情况,题解里说的我觉得很有道理。

运行时间:

运行比第一个5%好了一点 打败了29%用户。

4.以上两个题解一起理解和比较

总结发现上面都涉及到流程函数,我看了下书,稍微思考一下就会了,

其实重点都是在processing_time,上面是用了不同的流程函数,然后算平均数的方式不同,那我自己对没有使用avg()平均数函数的代码试一下。

5.第四个答案

我自己总结下来的第四个答案好强,就是结合了第二个答案和第三个答案,哈哈。

select machine_id,round(avg(case when a.activity_type='start' then -timestamp when a.activity_type='end' then +timestamp end)*2,3) as processing_time from Activity a group by machine_id;

运行时间:

打败了93.54%的,我还以为avg的用时长嘞,原来不是。

三、总结:

  • 统计每个机器的里的进程就应该想到分组。
  • 了解了两个流程函数,if();case when then end。
  • 使用了avg()平均值函数,round()四舍五入函数

  • 35
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值