MySQL案例 1.2.2 分地区排序

作者: SQL开发者

问题:

准备数据:

create table district_products(
    district text not null,
    name text not null,
    price numeric(10, 3) not null
);
insert into district_products(
    district,
    name,
    price
) values ('东北', '橘子', 100),
        ('东北', '苹果', 50),
        ('东北', '葡萄', 50),
        ('东北', '柠檬', 30),
        ('关东', '柠檬', 100),
        ('关东', '菠萝', 100),
        ('关东', '苹果', 100),
        ('关东', '葡萄', 70),
        ('关西', '柠檬', 70),
        ('关西', '西瓜', 30),
        ('关西', '苹果', 20);

问题: 按如下方式排序:

 district | name |  price  | rank_1
----------+------+---------+--------
 东北     | 橘子 | 100.000 |      1
 东北     | 苹果 |  50.000 |      2
 东北     | 葡萄 |  50.000 |      2
 东北     | 柠檬 |  30.000 |      4
 关东     | 柠檬 | 100.000 |      1
 关东     | 菠萝 | 100.000 |      1
 关东     | 苹果 | 100.000 |      1
 关东     | 葡萄 |  70.000 |      4
 关西     | 柠檬 |  70.000 |      1
 关西     | 西瓜 |  30.000 |      2
 关西     | 苹果 |  20.000 |      3

答案:

使用连接子查询:

select district,
        name,
        price,
        (select count(*) + 1
            from district_products as d2
        where d2.district = d1.district
            and d2.price > d1.price) as rank_1
from district_products as d1
order by district, price desc;

使用rank窗口函数:

select district,
        name,
        price,
        rank() over(
            partition by d.district
            order by d.price desc
        ) as rank_1
from district_products as d;

更多推荐

更多
  • MySQL实战宝典-27分布式事务:我们到底要不要使用2PC? 27 分布式事务:我们到底要不要使用 2PC?计。但是我们一直在回避分布式数据库中最令人头疼的问题,那就是分布式事务。 今天,我们就来学习分布式事务的概念,以及如何在海量互联网业务中实现它。 分布式事务概念 事务的概念相信你已经非
  • MySQL实战宝典-11索引出错:请理解CBO的工作原理 11 索引出错:请理解 CBO 的工作原理的使用已经有了一定的了解。 而在实际工作中,我也经常会遇到一些同学提出这样的问题:MySQL 并没有按照自己的预想来选择索引,比如创建了索引但是选择了全表扫描,这肯定是 MySQL 数据库的
  • MySQL实战宝典-21数据库备份:备份文件也要检查! 21 数据库备份:备份文件也要检查!据库可以进行切换(比如 20 讲基于复制或者 InnoDB Cluster 技术的高可用解决方案)。 除了高可用设计外,对架构师来说,还要做好备份架构的设计。因为我们要防范意外情况的发生,比如黑客删
  • MySQL实战宝典-15MySQL复制:最简单也最容易配置出错 15 MySQL 复制:最简单也最容易配置出错结构设计、索引设计。对业务开发的同学来说,掌握这些内容已经能很好地面向业务逻辑进行编码工作了。 但是业务需要上线,所以除了表和索引的结构设计之外,你还要做好高可用的设计。因为在真实的生产环
  • MySQL实战宝典-07表的访问设计:你该选择SQL还是NoSQL? 07 表的访问设计:你该选择 SQL 还是 NoSQL?的访问选型。这样一来,字段类型选择 + 物理存储设计 + 表的访问设计,就完成了表结构设计的所有内容。 前面 6 讲,我演示的都是通过 SQL 的方式对表进行访问,但从 MySQ
  • MySQL实战宝典-17高可用设计:你怎么活用三大架构方案? 17 高可用设计:你怎么活用三大架构方案?是为了铺垫 MySQL 数据库的高可用架构设计。因为复制是高可用的基础,但只用复制同步数据又远远不够,你还要结合自己的业务进行高可用设计。 同时,高可用也不仅仅是数据库的事情,你要从业务的全流
  • MySQL实战宝典-06表压缩:不仅仅是空间压缩 06 表压缩:不仅仅是空间压缩用户表、订单表。既然我们已经掌握了表的逻辑设计,那这一讲就继续学习不同业务表的物理存储设计。 据我观察,很多同学不会在表结构设计之初就考虑存储的设计,只有当业务发展到一定规模才会意识到问题的严重性。而物理
  • MySQL实战宝典-19高可用套件:选择这么多,你该如何选? 19 高可用套件:选择这么多,你该如何选?求,通过无损半同步复制的方式进行三园区的同城容灾设计,以及三地务中心的跨城容灾设计。 但是当数据库发生宕机时,MySQL 的主从复制并不会自动地切换,这需要高可用套件对数据库主从进行管理。
  • MySQL实战宝典-09索引组织表:万物皆索引 09 索引组织表:万物皆索引步深入了解 MySQL 的 B+ 树索引的具体使用,这一讲我想和你聊一聊 MySQL InnoDB 存储引擎的索引结构。 InnoDB 存储引擎是 MySQL 数据库中使用最为广泛的引擎,在海量大并发的 OL
  • MySQL实战宝典-12JOIN连接:到底能不能写JOIN? 12 JOIN 连接:到底能不能写 JOIN?优工作。但除了单表的 SQL 语句,还有两大类相对复杂的 SQL,多表 JOIN 和子查询语句,这就要在多张表上创建索引,难度相对提升不少。 而很多开发人员下意识地认为 JOIN 会降低
  • 近期文章

    更多
    文章目录

      推荐作者

      更多