sql中排序序號 怪異的排序

2021-10-18 00:04:47 字數 2562 閱讀 3095

今天在群裡看到了這樣的乙個需求,如下圖所示,將圖中左邊的資料轉變成右邊的結果。

咋一看,不就是先按姓名做排序,然後再分別對班組、機台號做排序麼。按這個思路寫出了 sql(表結構及資料在文末),得到的結果和預期的有點不一樣。

select 

* from

weird_order

order by 姓名,

班組,機台號

上面的 sql 執行的結果 >>

機台號  姓名     班組  

------  ------  --------

1  張三             1

2  張三             1

3  張三             1

1  李四             2

2  李四             2

3  李四             2

4  王五             1

5  王五             1

6  王五             1

7  賴八             2

8  賴八             2

9  賴八             2

4  趙柳             2

5  趙柳             2

6  趙柳             2

7  麻七             1

8  麻七             1

9  麻七             1

原來中文字段自有它的排序規則,只對姓名執行order by可以把同姓名的資料排在一起,卻不能讓不同名的人按照其在資料裡出現的順序排序。

上圖中右邊資料裡的姓名排序是按照左邊資料中該姓名出現的順序決定的,左邊最開始出現的姓名是「張三」,其次是「李四」,再接著「王五」、「趙柳」、「麻七」、「賴八」。

因此,我們只要將資料按照姓名出現的順序給它排序,然後對序號排序而不是姓名排序即可實現需求。

按姓名出現的順序分配的排序序號的 sql 可以這麼寫:

select 

姓名,min(原始序號) as 新序號

from

(select

*,row_number () over () as '原始序號'

from

weird_order) t

group by 姓名

分配的新序號的結果》

姓名     新序號  

------  --------

張三             1

李四             2

王五             7

趙柳             8

麻七            13

賴八            14

將原表和姓名排序的臨時結果關聯,按新序號、班組、機台號得到最終結果。

select 

t.機台號,

t.姓名,

t.班組

from

weird_order t

inner join

(select

姓名,min(原始序號) as 新序號

from

(select

*,row_number () over () as '原始序號'

from

weird_order) t

group by 姓名) tt

on tt.姓名 = t.姓名

order by 新序號,

班組,機台號

表結構及資料

create table weird_order

(機台號 int,

姓名 char(20),

班組 int

);insert into `weird_order` (`機台號`, `姓名`, `班組`)

values

(1, '張三', 1),

(1, '李四', 2),

(2, '張三', 1),

(2, '李四', 2),

(3, '張三', 1),

(3, '李四', 2),

(4, '王五', 1),

(4, '趙柳', 2),

(5, '王五', 1),

(5, '趙柳', 2),

(6, '王五', 1),

(6, '趙柳', 2),

(7, '麻七', 1),

(7, '賴八', 2),

(8, '麻七', 1),

(8, '賴八', 2),

(9, '麻七', 1),

(9, '賴八', 2);

sql server如何輸出排序序號 怪異的排序

今天在群裡看到了這樣的乙個需求,如下圖所示,將圖中左邊的資料轉變成右邊的結果。咋一看,不就是先按姓名做排序,然後再分別對班組 機台號做排序麼。按著這個思路寫出了 sql 表結構及資料在文末 得到的結果和預期的有點不一樣。select from weird order order by 姓名,班組,機...

mysql sql排序函式 SQL中排序函式的用法

sql中的排序函式有三 1 row number over 2 rank over 3 dense rank over 具體用法如下 1.row number over partition by 列名 order by 列名 desc 其中,partition by 是分組,在組內各自排序。row ...

mysql 中排序問題

現在有這樣一張表user,欄位為id,name,number.想要實現這樣的效果,以number排序,查詢某個id所在的資料排在第幾位,假如這個資料有幾個相同的,那麼取它為最低排名.例如有這麼幾行 id name number 1 a 10 2 b 20 3 c 10 4 d 5 現在查詢id為3的...