Mysql将查询后的数据进行排名的SQL语句
2016-11-26 14:34
513 查看
数据测试表
表名TEST
需求:这是一张店铺的虚拟表,ID为店铺ID,USER_ID为该店铺的发展人,现需要对USER_ID进行分组查询每个USER下共有多少家店铺,并对这个数据进行排名
思路:有点类似循环里面的自增一样,设置一个变量并赋予初始值,循环一次自增加1,从而实现排序;
mysql里则是需要先将数据查询出来并先行按照需要排序的字段做好降序desc,或则升序asc,设置好排序的变量(初始值为0):
a>.将已经排序好的数据从第一条依次取出来,取一条就自增加一,实现从1到最后的一个排名
b>.当出现相同的数据时,排名保持不变,此时则需要再设置一个变量,用来记录上一条数据的值,跟当前数据的值进行对比,如果相同,则排名不变,不相同则排名自增加1
c.当出现相同的数据时,排名保持不变,但是保持不变的排名依旧会占用一个位置,也就是类似于(1,2,2,2,5)这种排名就是属于中间的三个排名是一样的,但是第五个排名按照上面一种情况是(1,2,2,2,3),现在则是排名相同也会占据排名的位置
首先,我们先要把进行排名前的数据查询出来,这很简单
下面,就需要对上面的数据进行排名了
现在有三种排序方法,依次来举例
一、不管数据相同与否,排名依次排序(1,2,3,4,5,6,7.....)
结果如下:
这样子算是排序完成了,但是还会有一个缺点,拿上面数据来说,前两条和最后两条数据的quantity值相等,谁在前谁在后就不好说了,所以有了下面的方法
二、只要数据有相同的排名就一样,排名依次排序(1,2,2,3,3,4,5.....)
这时候就新增加了一个变量,用于记录上一条数据的记录了,只要当前数据记录跟上一条数据的记录比较,相同数量的排名就不变,不相同数量的排名就加一,并且更新变量的分数值为该条数据的分数,依次比较
结果如下:
如果你需要数量相同的排名也相同,但是后面的排名不能受到数量相同排名相同而不占位的影响,也就是哪怕你排名相同,你也占了这个位置(比如:1,2,2,4,5,5,7....这种形式的,虽然排名有相同,但是你占位了,后续的排名根据占位来排)于是
三、只要数据有相同的排名就一样,但是相同排名也占位,排名依次排序(1,2,2,4,5,5,7.....)
结果如下:
方法介绍完了,最后把三个排序结果放在一起对比一下
表名TEST
需求:这是一张店铺的虚拟表,ID为店铺ID,USER_ID为该店铺的发展人,现需要对USER_ID进行分组查询每个USER下共有多少家店铺,并对这个数据进行排名
思路:有点类似循环里面的自增一样,设置一个变量并赋予初始值,循环一次自增加1,从而实现排序;
mysql里则是需要先将数据查询出来并先行按照需要排序的字段做好降序desc,或则升序asc,设置好排序的变量(初始值为0):
a>.将已经排序好的数据从第一条依次取出来,取一条就自增加一,实现从1到最后的一个排名
b>.当出现相同的数据时,排名保持不变,此时则需要再设置一个变量,用来记录上一条数据的值,跟当前数据的值进行对比,如果相同,则排名不变,不相同则排名自增加1
c.当出现相同的数据时,排名保持不变,但是保持不变的排名依旧会占用一个位置,也就是类似于(1,2,2,2,5)这种排名就是属于中间的三个排名是一样的,但是第五个排名按照上面一种情况是(1,2,2,2,3),现在则是排名相同也会占据排名的位置
首先,我们先要把进行排名前的数据查询出来,这很简单
SELECT USER_ID, COUNT(*) as QUANTITY FROM TEST GROUP BY USER_ID ORDER BY QUANTITY结果如下:
下面,就需要对上面的数据进行排名了
现在有三种排序方法,依次来举例
一、不管数据相同与否,排名依次排序(1,2,3,4,5,6,7.....)
SELECT a.USER_ID, a.QUANTITY, @rownum := @rownum + 1 AS RANK FROM ( SELECT USER_ID, COUNT(*) AS QUANTITY FROM TEST GROUP BY USER_ID ORDER BY QUANTITY ) AS a, (SELECT @rownum := 0) r
结果如下:
这样子算是排序完成了,但是还会有一个缺点,拿上面数据来说,前两条和最后两条数据的quantity值相等,谁在前谁在后就不好说了,所以有了下面的方法
二、只要数据有相同的排名就一样,排名依次排序(1,2,2,3,3,4,5.....)
SELECT a.USER_ID, a.QUANTITY, CASE WHEN @rowtotal = a.QUANTITY THEN @rownum WHEN @rowtotal := a.QUANTITY THEN @rownum :=@rownum + 1 WHEN @rowtotal = 0 THEN @rownum :=@rownum + 1 END AS RANK FROM ( SELECT USER_ID, COUNT(*) AS QUANTITY FROM TEST GROUP BY USER_ID ORDER BY QUANTITY ) AS a, (SELECT @rownum := 0 ,@rowtotal := NULL) r
这时候就新增加了一个变量,用于记录上一条数据的记录了,只要当前数据记录跟上一条数据的记录比较,相同数量的排名就不变,不相同数量的排名就加一,并且更新变量的分数值为该条数据的分数,依次比较
结果如下:
如果你需要数量相同的排名也相同,但是后面的排名不能受到数量相同排名相同而不占位的影响,也就是哪怕你排名相同,你也占了这个位置(比如:1,2,2,4,5,5,7....这种形式的,虽然排名有相同,但是你占位了,后续的排名根据占位来排)于是
三、只要数据有相同的排名就一样,但是相同排名也占位,排名依次排序(1,2,2,4,5,5,7.....)
SELECT new.USER_ID, new.QUANTITY, new.RANK FROM ( SELECT a.USER_ID, a.QUANTITY, @rownum := @rownum + 1 AS num_tmp, @incrnum := CASE WHEN @rowtotal = a.QUANTITY THEN @incrnum WHEN @rowtotal := a.QUANTITY THEN @rownum END AS RANK FROM ( SELECT USER_ID, COUNT(*) AS QUANTITY FROM TEST GROUP BY USER_ID ORDER BY QUANTITY ) AS a, ( SELECT @rownum := 0 ,@rowtotal := NULL ,@incrnum := 0 ) r ) AS new
结果如下:
方法介绍完了,最后把三个排序结果放在一起对比一下
相关文章推荐
- mysql 中sql 语句查询今天、昨天、7天、近30天、本月、上一月 数据
- 导入外部数据+SQL语句的办法不支持参数查询,不过可以通过子查询进行模拟
- MySql查询数据字典的SQL语句
- Excel 中使用SQL 语句查询数据(八)-----用Group by 进行分组统计
- php中mysql一条sql语句查询出所有符合条件的数据,该怎么写?
- 从Mysql某一表中随机读取n条数据的SQL查询语句
- 转 mysql 中sql 语句查询今天、昨天、7天、近30天、本月、上一月 数据
- 【MySql性能优化二】利用explain进行查询和分析sql语句
- 从Mysql某一表中随机读取n条数据的SQL查询语句
- excel内一键进行sql查询(使用方法 1.选择’需要进行sql查询区域 包括字段名 2 输入sql语句 3.选择输出数据的单元格)
- mysql 中sql 语句查询今天、昨天、近7天、近30天、一个月内、上一月 数据
- mysql查询当天所有数据sql语句、查询数据表中的记录
- 从Mysql某一表中随机读取n条数据的SQL查询语句
- Excel 中使用SQL 语句查询数据(七)-----用LIKE 运算符进行模糊匹配查询
- mysql 中sql 语句查询今天、昨天、近7天、近30天、一个月内、上一月 数据 (转:冰糖葫芦)
- mysql的sql语句中直接计算时间 查询昨天 一周前 一月前 一年前的数据的方法
- 从Mysql某一表中随机读取n条数据的SQL查询语句
- 在Excel中使用SQL语句对多个数据表进行精确筛选 (查询)
- MySQL学习---->第二练:语句初步(SQL概述、数据定义、查询)
- 从Mysql某一表中随机读取n条数据的SQL查询语句