SQL分组查询然后取每一组的前N条数据

由于SQL的不同的数据库SQL的语法有些略微不同,所以我们这里采用MySQL展示。

创建表

create table person
(
  id           int auto_increment
      primary key,
  name         varchar(255) collate utf8mb4_general_ci null,
  salary       varchar(200)                           null,
  departmentId varchar(255)                           null
);

插入数据

insert into person
values ('1', 'Joe', '85000', '1'),
      ('2', 'Henry', '80000', '2'),
      ('3', 'Sam', '60000', '2'),
      ('4', 'Max', '90000', '1'),
      ('5', 'Janet', '69000', '1'),
      ('6', 'Randy', '85000', '1'),
      ('7', 'Will', '70000', '1');

查询每个每个部门中薪水最高的两个人的姓名和薪水,翻译成SQL语言就是按照部门分组,然后每一组按照薪水排序,取出薪水最大的两个人。

第一种:使用SQL的分窗函数(Oracle支持,MySQL8.0以后才支持)

select name, salary
from (select name, salary, rank() over (partition by departmentId order by salary desc ) as num
    from person) tmp
where tmp.num < 3
order by name;

第二种:SQL子查询

select name, salary
from person p1
where 2 > (
  select count(p2.salary)
  from person p2
  where p1.salary < p2.salary
    and p1.departmentId = p2.departmentId
)
order by p1.name;

SQL中的分组之后TOPN问题的更多相关文章

  1. 那些年我们踩过的坑,SQL 中的空值陷阱!

    文章目录 NULL 即是空 三值逻辑 空值比较 NOT IN 与空值 函数与空值 DISTINCT.GROUP BY.UNION 与空值 ORDER BY 与空值 空值处理函数 字段约束与空值 SQL ...

  2. sql中实现先排序后分组

    数据表结构和数据如下: CREATE TABLE `commun_message_chat_single` ( `id` ) NOT NULL AUTO_INCREMENT, `chat_id` ) ...

  3. sql中case when语句的使用-来自网摘文章

    Case具有两种格式.简单Case函数和Case搜索函数. --简单Case函数 CASE sex WHEN '1' THEN '男' WHEN '2' THEN '女' ELSE '其他' END ...

  4. PL/SQL中SELECT总结

      一.SELECT 语句的各个关键词的顺序及作用简解(这个我简略点写~) 1.SELECT 2.FROM 3.WHERE 4.GROUP BY ---对结果集进行分组,通常与聚合函数一起使用 5.H ...

  5. 转-sql中的case when的用法

    Case具有两种格式.简单Case函数和Case搜索函数. --简单Case函数 CASE sex WHEN '1' THEN '男' WHEN '2' THEN '女' ELSE '其他' END ...

  6. SQL 中ROLLUP 用法

    SQL 中ROLLUP 用法 ROLLUP 运算符生成的结果集类似于 CUBE 运算符生成的结果集. 下面是 CUBE 和 ROLLUP 之间的具体区别: CUBE 生成的结果集显示了所选列中值的所有 ...

  7. SQL中的5种聚集函数

    作为一个刚毕业进入这行的菜鸟,婶婶的觉的那种大神.大牛到底是怎样炼成的啊,我这小菜鸟感觉这TMD要学的东西这多啊,然后就给自己定了许多许多要学习的东西,可是有人又不停地给你灌输:东西不在多而要精通!我 ...

  8. SQL group by分组查询(转)

    本文导读:在实际SQL应用中,经常需要进行分组聚合,即将查询对象按一定条件分组,然后对每一个组进行聚合分析.创建分组是通过GROUP BY子句实现的.与WHERE子句不同,GROUP BY子句用于归纳 ...

  9. SQL中Case的使用方法(上篇)(转)

    http://www.cnblogs.com/fxgachiever/archive/2010/09/09/1822106.html Case具有两种格式.简单Case函数和Case搜索函数. --简 ...

随机推荐

  1. 【SpringMVC】数据校验时,抛出javax.validation.UnexpectedTypeException: HV000030: No validator could be found for type: java.util.Date.

    老魏原创,转载请留言. 原因:给Javabean中的字段注解多余或者错误导致. @NotEmpty @Past @DateTimeFormat(pattern="yyyy-MM-dd&quo ...

  2. 使用TK框架中updateByPrimaryKey与updateByPrimaryKeySelective区别

    int updateByPrimaryKey(T var1); int updateByPrimaryKeySelective(T var1); updateByPrimaryKeySelective ...

  3. Python JWT 介绍

    Python JWT 介绍 目录 Python JWT 介绍 1. JWT 介绍 2. JWT 创建 token 2.1 JWT 生成原理 2.2 JWT 校验 token 原理 3. 代码实现 4. ...

  4. Power BI官方客户案例2021

    微软商业应用峰会Power BI客户案例,今年的客户案例相比前2年不同,主要是大客户,基本都是行业Top公司. 选取零售,医药制造,教育,医疗IT等行业龙头.沃尔玛,拜耳,滑铁卢大学的分享内容非常棒, ...

  5. Beta——事后分析

    事后总结 NameNotFound 团队 项目 内容 北航-2020-软件工程(春季学期) 班级博客 要求 Beta事后分析 课程目标 通过团队合作完成一个软件项目的开发 会议截图 一.设想和目标 软 ...

  6. Spring Cloud Gateway之动态路由(数据库版)

    1.实现动态路由的关键是RouteDefinitionRepository接口,该接口存在一个默认实现(InMemoryRouteDefinitionRepository) 通过名字我们应该也知道该实 ...

  7. docker-compose如何动态配置springboot项目的application.yml的配置

    假如我们再springboot的工程中有配置文件 方式1: application.properties里面存在环境变量: #配置数据库链接 spring.datasource.url = jdbc: ...

  8. Linux 操作系统(一)命令&用户&权限

    以下实例均在Centos7下验证 Centos7 查看命令帮助 man xxx 常用命令 ls / cd - #切到上次目录 cd #回家 cat cat f1 f2 cat f1 f2>f3 ...

  9. Redis I/O 多路复用技术原理

    引言 Redis 是一个单线程却性能非常好的内存数据库, 主要用来作为缓存系统. Redis 采用网络 I/O 多路复用技术来保证在多个连接时,系统的高吞吐量(TPS). 系统吞吐量(TPS)指的是系 ...

  10. MyBaits 全局配置文件(mybatis-config.xml)

    什么是 MyBatis 全局配置文件 MyBatis 全局配置文件包含影响 MyBatis 框架正常使用的功能设置和属性信息. 它的作用好比手机里的设置图标,点击这个图标就可以帮助我们查看手机的属性信 ...