首页 > 数据库 >SQL:排名前几名中的前几名

SQL:排名前几名中的前几名

时间:2022-08-27 14:00:22浏览次数:48  
标签:name DISTINCT over rank 几名 SQL 排名 order desc

1.选择订单量排名前2的商品,并且选出每个商品订单量排名前3的销售方式,模拟数据如下:

name作为商品,count作为对应渠道的订单量,way为渠道

 

 通过excel法线,前两名存在3个:

 

 如果使用limit 2,会漏掉一个商品:(下面order by 应该用降序,写错了,加上desc即可)

 

 也可以加上distinct 和子查询改进,这里考虑使用窗口函数:

select * from
(
  select name,dense_rank()over( order by num desc) ranking
  from 
     (select name,sum(count) as num
    from 模拟.sid
    group by name
    order by num desc
    ) t
  ) t2
where ranking <=2

 

 找出了排名前2的商品,然后找订单量前3的渠道

select name,way,count,
dense_rank()over(partition by name order by count  desc) r2
from 模拟.sid

 

 然后将两个用商品名称连接:

 

 

 

 用excel检查没问题:

 

 2.选择num1排名前2中的前3num2,模拟数据:

 

 select id,num1,r1,r2 from
  (
  select id,num1,
    dense_rank()over(order by num1 desc) r1,
    dense_rank()over(partition by num1 order by num2 desc) r2
  from 模拟.sid2
  ) a
where r1 <=2
and r2 <=3

 

 用excel检查没问题

注意经典错误:使用xxx where ()in(xxx limit ) 

补充:

SQL去重:

假设table表中有字段a、b、c,现需要对字段a、b进行去重,在SQL中通常有三种方法能够实现去重的功能:

1) DISTINCT 关键字 使用DISTINCT去重的方法很简单,在查询数据时在字段前增加DISTINCT关键字既可对字段内容进行去重。如下代码将输出table表中字段a和b的组合不重复的数据: SELECT DISTINCT a,b FROM table;

2) GROUP BY关键字 使用GROUP BY进行去重的方法和DISTINCT类似,仅需在查询语句末端增加GROUP BY即可,而且能够对分组数据进行筛选。 SELECT a, b FROM table GROUP BY a, b;

3) 窗口函数 使用窗口函数进行去重时,比DISTINCT和GROUP BY稍微复杂些,可以采用窗口函数+over(partition by 去重字段)的方式。去重方式如下: -- 窗口函数+over(partition by 去重字段),其中窗口函数可采用row_number SELECT a, b FROM( SELECT *, row_number() over(partition by a, b order by c) rank_id FROM table ) A WHERE rank_id = 1;

 

标签:name,DISTINCT,over,rank,几名,SQL,排名,order,desc
From: https://www.cnblogs.com/djbwxh/p/16630462.html

相关文章

  • 数据库学习笔记 (本数据库学习笔记以SQL sever 2019 为例进行学习) 20220823 第一节课
    教材及参考数据库课程讲什么?内容安排第一部分数据库原理部分第一章数据库系统概述为什么要学习数据库?数据库的发展改变了人们的工作和生活模式信息积累与运用......
  • mysql-开启日志记录功能
    开启日志记录功能--开启功能SETGLOBALgeneral_log=ON;--保存到文件SETGLOBALlog_output='file';查看日志内容--查看日志保存位置及开启状态showvariab......
  • MySQL十六:36张图理解Buffer Pool
    转载~在应用系统中,我们为加速数据访问,会把高频的数据放在「缓存」(Redis、MongoDB)里,减轻数据库的压力。在操作系统中,为了减少磁盘IO,引入了「缓冲池」(bufferpool)机制......
  • MySQL十七:Change Buffer
    转载~在之前的文章《InnoDB的存储结构》介绍的InnoDB的存储结构的组成中,我们知道ChangeBuffer也是用InnoDB内存结构的组成部分。ChangeBuffer主要是为了在写入是减少......
  • Mysql----外连接,约束
    《外连接》这个外连接其实就是解决多张表笛卡尔集的问题:比如:    我有如上两张表,我想要显示出全部学生的成绩,没有成绩的同学默认成绩为NULL按照以前的方法,要将......
  • MySQL十八:写语句的执行过程
    转载~当我们需要修改一个记录时,数据库会先根据条件找到要修改的数据,然后执行修改写入操作,因此我们再分析写操作的执行过程时,其实是包含读语句的执行过程的。一、读语句的......
  • MySQL四:InnoDB的存储结构
    转载~「MySQL存储引擎最大的特点就是【插件化】,可以根据自己的需求使用不同的存储引擎,innodb存储引擎支持行级锁以及事务特性,也是多种场合使用较多的存储引擎。」当官方......
  • MySQL五:InnoDB线程模型
    转载~一、InnoDB线程模型的组成在Innodb存储引擎中,后台线程的主要作用是「负责刷新内存池中的数据,保证缓冲池中的内存缓存的是最近的数据」。此外它会将已经修改的数据文......
  • MySQL六:InnoDB数据文件
    转载~一、数据文件的组成innodb数据逻辑存储形式为表空间,而每一个独立表空间都会有一个.ibd数据文件,ibd文件从大到小组成:一个ibd数据文件-->Segment(段)-->Extent(区)-->P......
  • MySQL八:读懂MVCC多版本并发控制
    转载~mysql在并发的情况下,会引起脏读,幻读,不可重复读等一系列的问题,为解决这些问题,引入了mvcc的机制。本文就详细看看mvcc是怎么解决脏读,幻读等问题的。1、数据库事务1.......