一,使用窗口函数(mysql中不可用),row_number() /rank() /dense_rank()
1.row_number(): 重复值序号不相同
SELECT usid, time, amount, row_number() over (ORDER BY name DESC) AS no FROM deal ORDER BY row_number
2.rank(): 重复值序号相同,序号不连续
SELECT usid, time, name , rank () over (ORDER BY name DESC) AS no FROM deal ORDER BY rank
3.dense_rank(): 重复值序号相同,序号连续
SELECT usid, time, name, dense_rank() over (ORDER BY name DESC) AS no FROM deal ORDER BY dense_rank
二,不使用窗口函数(如mysql中)
SELECT a.*, ( SELECT count(DISTINCT amount) FROM deal WHERE amount >= a.amount ) AS rank FROM deal a ORDER BY rank
三,利用变量(MySQL中)
1. 遇到相同值继续排序,序号连续不重复,排序效果同row_number()窗口函数
SET @no := 0; SELECT *,@no := @no + 1 AS no FROM deal ORDER BY amount DESC
今天在群里看到了这样的一个需求,如下图所示,将图中左边的数据转变成右边的结果。咋一看,不就是先按姓名做排序,然后再分别对班组、机台号做排序么。按着这个思路写出了 SQL(表结构及数据在文末),得到的结果和预期的有点不一样。SELECT
weird_order
ORDER BY 姓名,
机台号上面的 SQL 执行的结果 >> 机台号 姓名 ...
一、排序规则简介: 什么叫排序规则呢?MS是这样描述的:"在 Microsoft SQL Server 中,字符串的物理存储由排序规则控制。排序规则指定表示每个字符的位模式以及存储和比较字符所使用的规则。" 在查询分析器内执行下面语句,可以得到SQL SERVER支持的所有排序规则。 select * from ::fn_helpcollations() 排序规则名称由两部份构