问题描述

请教为什么第一个query返回的数据不正确?

​
-- 求Department Highest Salary:-- 第一个query:select Department.name as Department, Employee.name as Employee, MAX(Employee. Salary) as Salary
from Employee inner join Department on Employee.departmentId = Department.id
group by DepartmentId;-- 第二个query:
select d.name as Department, e.name as Employee, e.salary as salary
from Employee as e
inner join Department as d
on e.departmentId = d.id
inner join (
select max(salary) as Salary, departmentId
from Employee
group by departmentId
) as mx
on e.salary = mx.Salary AND e.departmentId = mx.departmentId;​

问题分析

--#1 问题分析
-- Ques1:如果我们通过max、min进行分组聚合时有重复的,那么只会其中取一个(如部门里两人的工资一样)。
-- Ques2:Query1不是个正常的GROUP BY语句,在Mysql可以执行,但Employee name返回的是每组里主键最小的,
-- 这和实际明显不符预期。详见#3处分析。--#2 Way3,可以通过RANK来达到同样的效果
SELECT * FROM
(
select dept.dname as Department, emp.ename as Employee, sal,
RANK()OVER(PARTITION BY dept.deptno ORDER BY Sal DESC) rn
from emp inner join dept on emp.deptno = dept.deptno
)A
WHERE A.rn=1/* 结果
Department  Employee    sal rn
ACCOUNTING  KING            5000.00 1
RESEARCH    FORD            3000.00 1
RESEARCH    SCOTT           3000.00 1
SALES           BLAKE           2850.00 1
*/
--#3 通过查看query1结果不难发现和Way3相比不仅记录数不对而且出来的Employee也对不上。
select dept.dname as Department, emp.ename as Employee,
MAX(sal)
from emp inner join dept on emp.deptno = dept.deptno
GROUP BY dept.deptno
/* 结果
Department  Employee    MAX(sal)
ACCOUNTING  CLARK           5000.00
RESEARCH    SMITH           3000.00
SALES           ALLEN           2850.00
*/
-- 按部门分组,最小员工号对应的员工名称。
SELECT MIN(empno),deptno,ename FROM emp
GROUP BY deptno
/* 结果
MIN(empno)  deptno  ename
7782    10  CLARK
7369    20  SMITH
7499    30  ALLEN
*/

数据集

SQL案例_0_员工表数据集_数据科学汇集-CSDN博客数据库数据集数据集说明这里参考Oracle的SCOTT用户下的员工信息表,该用户下有4张表。详细的员工表结构和数据见网盘链接:链接:https://pan.baidu.com/s/1CbnJSOSZPGruJBBAr3TmKQ提取码:2k0pEMP(员工的姓名、员工号、领导编号、部门编号、岗位、雇佣日期、工资、奖金等)DEPT(部门的名称、部门编号、部门所在位置)SALGRADE(工资等级、等级对应...https://shenliang.blog.csdn.net/article/details/115341944

一条mysql分组查询的问题分析相关推荐

  1. Mysql分组查询每组最新的一条数据(三种实现方法)

    MySQL分组查询每组最新的一条数据 前言 注意事项 准备SQL 错误查询 错误原因 方法一 方法二(适用于自增ID和创建时间排序一致) 方法三(适用于自增ID和创建时间排序一致) 总结 MAX()函 ...

  2. mysql分组查询只获取第一条

    mysql分组查询只获取第一条 接到一个需求: 需要获取协议表里所有供应商对应最新的采购员. 由于协议表里供应商的协议会有多个,可能采购员也不是同一个,所以需要做到聚合.筛选才能达到效果. -- 外层 ...

  3. 12个MySQL慢查询的原因分析

    1. SQL 没加索引 很多时候,我们的慢查询,都是因为没有加索引.如果没有加索引的话,会导致全表扫描的.因此,应考虑在 where 的条件列,建立索引,尽量避免全表扫描. 反例: select * ...

  4. MySQL分组查询,获取分组后数据

    MySQL分组查询,获取分组后数据 MySQL分组查询,将其它列的数据,合并到一行展示,可以设置去重,设置去重,设置排序,截取指定条数 创建表结构 CREATE TABLE `author_info` ...

  5. MySQL分组查询跟聚合函数

    MySQL分组查询跟聚合函数 一.分组查询的语句 GROUP BY { <列名> | <表达式> | <位置> } [ASC | DESC] 这个语句中间{ < ...

  6. mysql分组查询和分组过滤

    mysql分组查询使用的的关键字是group by,分组过滤使用到的关键字是having.需要先分组查询才能进行分组过滤,个人理解having和where的区别有以下: 1.聚集函数count.sum ...

  7. mysql 分组查询最新

    mysql分组查询最新 看到网上说到的方法和我写的都一样,也不知道有没有更好的方法,等到解答. SELECT id,group_id from (SELECT id,group_id from tab ...

  8. 一条mysql语句查询出男女的人数

    统计报表中,为了实现一条mysql语句查询出男女的人数,sql语句如下: #年末年龄统计表 select COUNT(case when info.sex = 'm' then sex end ) a ...

  9. MySQL分组查询最新的一条记录

    问题描述 使用关键字 group by,和order by,但是直接在查询语句后跟上group和order会失效 举例说明:table表中的每个code最新的一条数据 失效写法: SELECT t.` ...

最新文章

  1. 双十一,假如有人把支付宝存储服务器炸了,你的钱是不是都没了?
  2. 声明式服务调用feign原理图解
  3. Windows下安装Anaconda3与配置
  4. vc++6.0的工作空间/工作区是什么?工程 文件 工作区什么区别?
  5. hive与hbase整合方式和优劣
  6. UVA - 1604Cubic Eight-Puzzle立体八数码
  7. 自主学习 提问的智慧——学习中遇到难题怎么破?
  8. 本地存储之sessionStorage
  9. singleflight包原理解析
  10. spring boot log4j2与三方依赖库log4j冲突无法初始化问题解决方法
  11. C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(十七) 完美精灵之八面玲珑(WPF Only)①...
  12. 土建中级工程师考试用书电子版_对没错!2020年湖南土建中级职称考试教材只是指导用书...
  13. mysql数据库没有导出权限_mysql导出没有数据库
  14. 基础类库,注释,异常,集合,泛型
  15. Python自动检查哪位学生未提交作业
  16. latex安装报错-failed: No such file or directory at G://tlpkg/TeXLive/TLUtils.pm line 1383, <STDIN> line
  17. HDU 1019 Least Common Multiple-数论(最小公倍数)
  18. 带你去看2020大数据就业形势
  19. 谷歌浏览器点击保存密码了,下次进入网页还要重新输入密码
  20. outlook删除服务器文件夹,如何还原已删除的Outlook文件夹[最佳方式]

热门文章

  1. VTK:隐式球体用法实战
  2. boost::statechart模块实现终止测试
  3. boost::serialization模块指针反序列化的安全异常处理示例
  4. boost::mp11::mp_nth_element相关用法的测试程序
  5. boost::fusion::count用法的测试程序
  6. boost::posix_time模块实现本地时间和 UTC 之间的转换的测试程序
  7. GDCM:创建DICOMDIR的测试程序
  8. boost的chrono模块特殊值的测试程序
  9. Boost:使用accumulator_set <>和std :: for_each()计算一些有用的统计信息
  10. ITK:侵蚀灰度图像