场景

有一张得分表(score),记录了用户每次的得分,同一个人可能有多个得分。

id name score
1 tom 45
2 jack 78
3 tom 34
. . .

需求:找出分数最高的前5个人。

SQL1

首先我们写个最简单的sql:

select id, name, score
from score
order by score desc
limit 5;

如果sql这样写,结果可能是:

id name score
2 jack 78
1 tom 45
3 tom 34

排序了,但是没有去重

SQL2

那么我们加上去重:

select distinct name
from score
order by score desc
limit 5;

首先第一点是这个sql未必能执行。在一些数据库版本,这个sql可以被执行,在一些版本则会提示你order by的字段必须在distinct中存在(见SQL3)。

但是即使能执行,这个sql也得不到预期结果。原因是distinct优先于order by 被数据库执行。

在执行distinct name的时候,如上文中的数据。是取id=1的数据,还是id=3的数据呢?其实这是数据库自行决定的。因此,可能会不正确选择数据。

比如真的执行这个sql,可能去重的结果是:

id name score
2 jack 78
3 tom 34

然后再执行一个order by,就会认为第一名是jack78分,第二名是tom34分。然而其实tom应该是45分,这个45分就在数据库执行distinct的时候被错误的丢弃了,毕竟先执行distinct的时候不知道你到底要哪个数据。

SQL3

那么我们把score加入select中呢?

select distinct name, score
from score
order by score desc
limit 5;

很明显,这样写的执行结果和我们预期不符。因为如果写:distinct name,score实际上是对name和score一起去重。比如name都是jack,score都是45。那么这行就会被去掉。

但是问题是正因为把score当做去重的条件了。所以对于同名的人,比如都叫tom,会因为其有两个分数,导致不能被去重,从而保留两行记录。结果就是好像没有去重。

SQL4

那我不用distinct,用group by进行去重可以吗?

select name
from score
group byname
order by score desc
limit 5;

也不行,因为在group by的时候,数据库还是不知道对两行name一样的数据,究竟应该留下哪一行。

SQL5

正确的写法:

select name
from score
group byname
order by max(score) desc
limit 5;

这样写,在执行group by的时候,数据库就知道要保留score最大的那一行了。

转载于:https://www.cnblogs.com/dsj2016/p/10679366.html

sql如何先排序再去重相关推荐

  1. http://www.dewen.net.cn/q/16007/mysql查询如何先排序再分组呢

    http://www.dewen.net.cn/q/16007/mysql查询如何先排序再分组呢 kwooshung 2 票 kwooshung 11 比如数据表"article" ...

  2. SQL中先排序再筛选与先筛选再排序

    SQL中先排序再筛选与先筛选再排序 一.基础知识 Select 字段1,字段2,-- from 数据表 where 条件1:从数据表中将符合条件1的记录中的相关字段1.字段2筛选出来: Order b ...

  3. mysql 先排序再去重_有人说先学会三轴,再去搞四轴、五轴加工中心,这几种有何区别?...

    有人说先学会三轴,再去搞四轴.五轴加工中心,这几种机床有何区别呢? 三轴加工中心的的作用及优点: 立式加工中心(三轴)最有效的加工面仅为工件的顶面,卧式加工中心借助回转工作台,也只能完成工件的四面加工 ...

  4. SQL语法之排序查询(进阶3)and常见函数(进阶4)

    SQL语法体系学习笔记 SQL语法之基础查询(进阶1)and条件查询(进阶2) SQL语法之排序查询(进阶3)and常见函数(进阶4) SQL语法之分组函数,分组查询(进阶5)and连接查询(sql9 ...

  5. mysql先排序再分组筛选_mysql 怎样先排序再分组

    权游游牧族:众所周知!一句SqL语句不能先排序再分组.所以这里给出几个案例 --表结构-- create table `shop` ( `id` int (10) PRIMARY KEY, `shop ...

  6. C#.net工作笔记001---Linq对象查询,排序,分组,去重在工作中的使用_随时更新

    技术交流QQ群[JAVA,.NET,BigData,AI]:170933152 1.对list中的某两个字段按照升序排序 testlist=testlist.OrderBy(s=>new{s.c ...

  7. php大文件怎么排序去重,简单实现大文件的排序和去重

    有一道校招生的面试题,是要给一个很大的文件(不能全部放内存,比如1T)按行来排序和去重. 一种简单解决方案就是分而治之,先打大文件分词大小均匀的若干个小文件,然后对小文件排好序,最后再Merge所有的 ...

  8. 试题11 蒜头君的随机数(排序和去重)

    题目: 蒜头君想在学校里请一些同学一起做一项问卷调查,为确保实验客观性,他先用计算机生成n(i<=n<=100)个1到1000之间的随机整数,对于其中重复的数字,只保留一个,把其余相同的数 ...

  9. 使用SQL2005 递归查询结合Row_Number()实现完全SQL端树排序

    使用SQL2005 递归查询结合Row_Number()实现完全SQL端树排序 在实际应用中,我们经常需要用到树型结构功能,数据库结构一般如下 即用一个ParentID来标识该节点从属关系.为了最终生 ...

最新文章

  1. ubuntun 下安装 node-v0.10.26
  2. numpy 矩阵乘法_一起学习Python常用模块——numpy
  3. python一共有多少个内置函数_Python 35个内置函数,你都ok吗?
  4. 海信计算机辅助统,海信计算机辅助手术系统将覆盖山东三级医院
  5. 解决linux下终端无法输入的假死问题
  6. iOS线程生命周期的监控
  7. python导入requests库_windows环境中python导入requests
  8. ECShop 批量打印快递单
  9. 拯救报错:Error: connect ETIMEDOUT
  10. 保龄球计分c语言,保龄球的好处、起源、计分规则、常用技法
  11. js 除了自己获取其他所有兄弟节点
  12. java 判断实体为空_Java 判断实体类属性是否为空工具类
  13. SQL简明数据分析教程
  14. 基于Modis的遥感数据的地表温度的获取解决方案--以京津唐为例
  15. 服务器响应程序,封装高可复用的服务端响应SSC程序修复对象 --ServerResponse
  16. ssh备考-07 搭建spring框架环境
  17. 软件外包公司到底能不能去工作?
  18. 计算机动画原理课程设计,小议动画运动规律的课程设计论文
  19. Selenium原理介绍
  20. 如何创建一个基于Maven的SmartGWT项目

热门文章

  1. SAP CRM responsibility的维护
  2. SAP Kyma组件一览
  3. SAP S4HANA里关于生产订单的一些重要数据库表
  4. 如何使用SAP CRM Marketing Survey创建一个市场问卷调查
  5. Linux Ubuntu终端“@”前后的含义及修改(修改用户名及主机名)【试用办法,部分不可行】
  6. Json字符串转对象,使用ObjectMapper方式报错:no String-argument constructor/factory method
  7. arch linux 安装xfce_树莓派安装ArchLinux+桌面环境
  8. html 横屏内容显示不全_“屏”什么喜欢你,车载显示器有哪些新玩法...
  9. linux read nchars,Linux常用命令--read
  10. 第三章计算机试题,计算机等级考试二级VB测试题(第三章)