以下内容首发于我的个人博客网站:
http://riun.xyz


来自一位朋友最近做的携程笔试题,其中有一道关于SQL的题目是这样的:

一、题目

Mysql数据库中有如下两张表,app表为应用表,储存的是应用相关信息;alert表为预警表,储存的是各应用在一段时间内的预警信息。

app:

app_id app_name
1001 应用1
1002 应用2

alert:

alert_id app_id alert_info alert_date
324324 1001 预警信息1 2020-02-01 12:30:23
342343 1002 预警信息2 2020-02-01 12:31:23

请写出查询出前7天内预警数是Top3的应用名称及其预警数,并按预警数由大到小排序。

原题目图片:



给出的两表数据是这样的:

给出的最终查询结果是这样的:

app_id app_name alert_count
1001 application1 4
1005 application5 3
1002 application2 2

二、我的理解

最初审视这道题目的时候,读到**”查询出前7天内预警数是Top3”,我的想法是从最早的时间开始,向后算7天内的数据**。即,若今天是4.1号,最早的时间就是3.22号,那么前7天内的数据应该是在3.22~3.28之间的数据。我们暂且把这个叫做思路1。

按照思路1,我开始写sql,但最终因为无法想出【从最早的时间开始,向后数7天】这个限制条件到底应该怎样写而以失败告终。所以只写了一个不包含此条件的sql。

我的sql是:

select app.app_id, app.app_name, res.count alert_count
from app RIGHT JOIN
(select app_id, count(*) count from alert GROUP BY app_id order by count desc LIMIT 3) res
on app.app_id = res.app_id

如果知道这个条件怎样写,那么向里面添加 where 时间限制条件即可。

即,最终的sql应该是:

select app.app_id, app.app_name, res.count alert_count
from app RIGHT JOIN
(select app_id, count(*) count from alert where 时间限制条件 GROUP BY app_id order by count desc LIMIT 3) res
on app.app_id = res.app_id

暂且先不说这个时间限制条件,也不说这个sql是否符合题意要求,来说说我的思路吧。

题目:【查询出前7天内预警数是Top3的应用名称及其预警数,并按预警数由大到小排序】,我的思路是如下展开的:

1、由于在alert表中每条同一台应用的预警信息都有相同的app_id,那么我首先想到了要在alert表里对app_id进行分组,分组后查出各组的数量,就得到了应用与预警数的对照表。那么sql就是:

select app_id, count(*) from alert GROUP BY app_id

(上述将count(*)换成count(qpp_id)是相同的)

查询结果:

2、然后将其按照预警数倒序排序并只拿出top3。sql就是:

select app_id, count(*) count from alert GROUP BY app_id ORDER BY count desc LIMIT 3

查询结果:

这样只需要再拿到app_name即可。app_nameapp表里,那么将查询结果作为一个新表与app表做连接查询即可查询出结果。sql是:

select app.app_id, app.app_name, res.count alert_count
from app RIGHT JOIN
(select app_id, count(*) count from alert GROUP BY app_id order by count desc LIMIT 3) res
on app.app_id = res.app_id

查询结果:

这样看来好像添加上 where 时间限制条件这道题目就解决了。可是后来我又重新审视了一遍题目,发现了一些问题…

三、另一个选择

当我再次审视这道题时,我将数据仔仔细细的对照了一遍。如果按照我的思路1,即,题目中的【查询出前7天内预警数是Top3】这样理解:“若今天是4.1号,最早的时间就是3.22号,那么前7天内的数据应该是在3.22~3.28之间的数据“。仔细观察给出的数据,如果这样算,所有数据都被包含进去了,并没有任何一个数据因为【前7天内】这个限制条件而被刷掉,那么给出的查询限制条件就没有了意义。那么干嘛还要这个多余的限制条件呢?为了迷惑作答者的思路?为了让作答者写这个”比较难写而对本题无意义的“的时间限制条件吗?

我觉得不是。

于是我就尝试着换了一个我并不赞同的方式思考。假设题目中【查询出前7天内预警数是Top3】是另一个意思:以目前为时间点,向前数7天。比如今天是4.1,那么前7天内的数据应该是在3.26~4.1之间的数据。 再回头看数据, 这样算来就存在3.22号和3.24号这两天的数据被刷掉,那么这个限制条件便有了意义。我们把这个叫做思路2。

现在我们不写sql语句,我口述下数据情况(顺序不代表插入顺序)来判断此思路是否正确:

  • 3.22号1003机器预警
  • 3.14号1002机器预警
  • 3.26号:
    • 1001机器预警,共4次
    • 1002机器预警,共2次
    • 1003机器预警,共1次
    • 1004机器预警,共1次
    • 1005机器预警,共3次

以上是给出的数据所表达出来的是实际情况。而题目**“请写出查询出前7天内预警数是Top3的应用名称及其预警数,并按预警数由大到小排序。”** 所给出的结果是:

top3分别是:

  • 1001,4次预警
  • 1005,3次预警
  • 1002,2次预警

就说明了题目是按照思路2来的

如果按照思路1来,没有数据被刷掉,使用了全部数据,那么结果应该是:

top3分别是:

  • 1001,4次预警
  • 1002、1005,均3次预警
  • 1003,2次预警

显然并不符合给出的结果。

好了,这个乌龙被发现后,我再次看我按照思路1写的sql:就算我们找到了那个符合思路1的正确的where 时间限制条件,添加进去我们的sql仍然不对,因为题目她并不是这个意思啊 …( _ _)ノ|。 不知道这个算不算是出题者的一个失误:按照题目的意思明显是思路1,但是给出的结果却是参照思路2的。

除此之外我的sql还有一个错误,按照思路1来top3包含了4条数据,有一个同排名的数据。而我并没有查出4条数据,且至今仍不知道如何将这个相同排名的全部查出来…

相同排名全部查询】先告一段落,我们来看这道题。现在知道了她是按照思路2走,就好办了,以当前时间点为参照,查询出前7天内的数据的限制语句是:

where DATE_SUB(CURDATE(), INTERVAL 6 DAY) <= date(时间字段)

我们将此字段添加到我的sql中:

select app.app_id, app.app_name, res.count alert_count
from app RIGHT JOIN
(select app_id, count(*) count from alert where DATE_SUB(CURDATE(), INTERVAL 6 DAY) <=
date(alert_date) GROUP BY app_id order by count desc LIMIT 3) res
on app.app_id = res.app_id

查询结果:

和所要求的查询结果一致。sql正确。(不过我的查询仍不适用于存在相同排名的情况下,只适用本道题目)

希望你看的开心(●’◡’●)

一道携程SQL笔试题相关推荐

  1. 携程2020笔试题——《买饮料》

    题目描述 游游今年就要毕业了,和同学们在携程上定制了日本毕业旅行.愉快的一天行程结束后大家回到酒店房间,这时候同学们都很口渴,是石头剪刀布选出游游去楼下的自动贩卖机给大家买可乐.贩卖机只支持硬币支付, ...

  2. 携程SQL面试题忘大牛解答解决思路

    讨论地址:http://bbs.csdn.net/topics/380208742

  3. 妙用Python集合求解啤酒问题(携程2016笔试题)

    问题描述:一位酒商共有5桶葡萄酒和1桶啤酒,6个桶的容量分别为30升.32升.36升.38升.40升和62升,并且只卖整桶酒,不零卖.第一位顾客买走了2整桶葡萄酒,第二位顾客买走的葡萄酒是第一位顾客的 ...

  4. Python求解啤酒问题(携程2016笔试题)

    问题描述:一位酒商共有5桶葡萄酒和1桶啤酒,6个桶的容量分别为30升.32升.36升.38升.40升和62升, 并且只卖整桶酒,不零卖.第一位顾客买走了2整桶葡萄酒,第二位顾客买走的葡萄酒是第一位顾客 ...

  5. 常见的SQL笔试题和面试题:SQL经典50题

    常见的SQL笔试题和面试题(上):经典50题 已知有如下4张表: 学生表:STUDENT(S#,SNAME,SAGE,SSEX) 课程表:COURSE(C#,CNAME,T#) 成绩表:SC(S#,C ...

  6. sql 以a开头的所有记录_#9#猴子聊数据分析之常见的SQL笔试题和面试题(下)

    题目来源 猴子:常见的SQL笔试题和面试题(下)​zhuanlan.zhihu.com 1.SQL语言允许使用通配符进行字符串匹配的操作,其中'%'可以表示:多个字符 2.通过 SQL,如何从 &qu ...

  7. oracle sql 题目,oracle sql笔试题

    oracle sql笔试题 一. 数据库 ORACLE 虽然这些题目都可以G到,但还是要考察一下您现在的常态水平,:) T表:(字段:ID,NAME,ADDRESS,PHONE,LOGDATE) E表 ...

  8. java笔试题_一道简单的 Java 笔试题,但值得很多人反思

    专注于Java领域优质技术,欢迎关注 作者:匿蟒 前言 面试别人,对我来说是一件新奇事,以前都是别人面试我.我清楚地知道,我在的地域与公司,难以吸引到中国的一流软件人才.所以,我特地调低了期望,很少问 ...

  9. 分享一道蚂蚁金服笔试题

    之前有个朋友面试蚂蚁金服p7,他的笔试题我要了过来,我觉得这道题目还是比较经典的,有兴趣的朋友不妨先拿来热热身. 实现转账系统,给外部系统提供账户开户,充值,转账rpc服务,要求如下,- 账户类设计: ...

  10. 一道经典SQL笔试题(求各部门最高薪水的部门名称、员工姓名以及薪水)

    我前两天写了一篇标题一样的博客,有道友评论说我的写法有问题,当时脑子一蒙就被带偏了,以为自己写错了,就把原来的删除了,结果下来验证了一下自己的写法还是没有问题,所以这次补上. 题是这样的: 有两个表, ...

最新文章

  1. 依赖类型dependency type在maven中的作用
  2. “AI+”农业向农民致敬-丰收节交易会:谋定工业反哺农业
  3. 笔记-高项案例题-2018年下-范围管理
  4. 【Netty】TCP粘包和拆包
  5. 膜拜大牛!Android开发最佳实践手册全网独一份,终获offer
  6. 《编码规范和测试方法——C/C++版》作业 ·003——宏定义作用整理、设计删除数组元素的函数
  7. Java前端顺序,java种初始化顺序
  8. 补码中的+0和-0为什么机器码相同?
  9. 小波变换与傅里叶变换的区别
  10. 计算机机房日常巡检内容,IT机房巡检工作流程及标准.doc
  11. laravel项目启动
  12. 《金融学》笔记 第五章 金融市场
  13. 在Qt中设置程序图标的方法介绍
  14. 名帖47 钟繇 小楷《宣示表》
  15. WIN10 Outlook 2013 pst/ost邮件数据文件迁移
  16. c语言俄罗斯方块程序设计论文,c语言俄罗斯方块游戏程序设计报告
  17. nfsd linux是什么进程,如何从NFS启动Linux及原理
  18. 组件通信之sync-父子数据同步
  19. qlv视频转换器免费版_腾讯视频素材下载和转换教程
  20. wps 甘特图_制作甘特图提升办公效率!亿图下的这款项目管理软件很不错

热门文章

  1. 论软件产品的易用性(一)
  2. 从零开始学androidBroadCast广播.四十五.
  3. Java精品项目第33期前台展示+后台管理结合的在线购书系统
  4. 基于javaweb+mysql的网上书店管理系统在线购书系统(前台、后台)
  5. 陪学网腾讯直播课堂开课啦~免费、免费、免费,重要的事情说三遍
  6. Sailfish OS构建(1)
  7. 第一课----色彩构成与色彩模式
  8. android 版本 6.0升级包,EMUI 6.0系统刷机包
  9. 侠客行java_侠客行
  10. 什么是智慧房屋租赁系统