sql如何先排序再去重
场景
有一张得分表(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如何先排序再去重相关推荐
- http://www.dewen.net.cn/q/16007/mysql查询如何先排序再分组呢
http://www.dewen.net.cn/q/16007/mysql查询如何先排序再分组呢 kwooshung 2 票 kwooshung 11 比如数据表"article" ...
- SQL中先排序再筛选与先筛选再排序
SQL中先排序再筛选与先筛选再排序 一.基础知识 Select 字段1,字段2,-- from 数据表 where 条件1:从数据表中将符合条件1的记录中的相关字段1.字段2筛选出来: Order b ...
- mysql 先排序再去重_有人说先学会三轴,再去搞四轴、五轴加工中心,这几种有何区别?...
有人说先学会三轴,再去搞四轴.五轴加工中心,这几种机床有何区别呢? 三轴加工中心的的作用及优点: 立式加工中心(三轴)最有效的加工面仅为工件的顶面,卧式加工中心借助回转工作台,也只能完成工件的四面加工 ...
- SQL语法之排序查询(进阶3)and常见函数(进阶4)
SQL语法体系学习笔记 SQL语法之基础查询(进阶1)and条件查询(进阶2) SQL语法之排序查询(进阶3)and常见函数(进阶4) SQL语法之分组函数,分组查询(进阶5)and连接查询(sql9 ...
- mysql先排序再分组筛选_mysql 怎样先排序再分组
权游游牧族:众所周知!一句SqL语句不能先排序再分组.所以这里给出几个案例 --表结构-- create table `shop` ( `id` int (10) PRIMARY KEY, `shop ...
- C#.net工作笔记001---Linq对象查询,排序,分组,去重在工作中的使用_随时更新
技术交流QQ群[JAVA,.NET,BigData,AI]:170933152 1.对list中的某两个字段按照升序排序 testlist=testlist.OrderBy(s=>new{s.c ...
- php大文件怎么排序去重,简单实现大文件的排序和去重
有一道校招生的面试题,是要给一个很大的文件(不能全部放内存,比如1T)按行来排序和去重. 一种简单解决方案就是分而治之,先打大文件分词大小均匀的若干个小文件,然后对小文件排好序,最后再Merge所有的 ...
- 试题11 蒜头君的随机数(排序和去重)
题目: 蒜头君想在学校里请一些同学一起做一项问卷调查,为确保实验客观性,他先用计算机生成n(i<=n<=100)个1到1000之间的随机整数,对于其中重复的数字,只保留一个,把其余相同的数 ...
- 使用SQL2005 递归查询结合Row_Number()实现完全SQL端树排序
使用SQL2005 递归查询结合Row_Number()实现完全SQL端树排序 在实际应用中,我们经常需要用到树型结构功能,数据库结构一般如下 即用一个ParentID来标识该节点从属关系.为了最终生 ...
最新文章
- ubuntun 下安装 node-v0.10.26
- numpy 矩阵乘法_一起学习Python常用模块——numpy
- python一共有多少个内置函数_Python 35个内置函数,你都ok吗?
- 海信计算机辅助统,海信计算机辅助手术系统将覆盖山东三级医院
- 解决linux下终端无法输入的假死问题
- iOS线程生命周期的监控
- python导入requests库_windows环境中python导入requests
- ECShop 批量打印快递单
- 拯救报错:Error: connect ETIMEDOUT
- 保龄球计分c语言,保龄球的好处、起源、计分规则、常用技法
- js 除了自己获取其他所有兄弟节点
- java 判断实体为空_Java 判断实体类属性是否为空工具类
- SQL简明数据分析教程
- 基于Modis的遥感数据的地表温度的获取解决方案--以京津唐为例
- 服务器响应程序,封装高可复用的服务端响应SSC程序修复对象 --ServerResponse
- ssh备考-07 搭建spring框架环境
- 软件外包公司到底能不能去工作?
- 计算机动画原理课程设计,小议动画运动规律的课程设计论文
- Selenium原理介绍
- 如何创建一个基于Maven的SmartGWT项目
热门文章
- SAP CRM responsibility的维护
- SAP Kyma组件一览
- SAP S4HANA里关于生产订单的一些重要数据库表
- 如何使用SAP CRM Marketing Survey创建一个市场问卷调查
- Linux Ubuntu终端“@”前后的含义及修改(修改用户名及主机名)【试用办法,部分不可行】
- Json字符串转对象,使用ObjectMapper方式报错:no String-argument constructor/factory method
- arch linux 安装xfce_树莓派安装ArchLinux+桌面环境
- html 横屏内容显示不全_“屏”什么喜欢你,车载显示器有哪些新玩法...
- linux read nchars,Linux常用命令--read
- 第三章计算机试题,计算机等级考试二级VB测试题(第三章)