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

2021-10-11 23:00:58 字數 2563 閱讀 9197

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

咋一看,不就是先按姓名做排序,然後再分別對班組、機台號做排序麼。按著這個思路寫出了 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);

SQLSERVER如何使用遞增排序的GUID做主鍵

場景 產品表資料量較大想用guid做表的主鍵,並在此字段上建立聚簇索引。因為guid是隨機生成的,生成的值大小是不確定的,每次生成的數可能很大,也可能很小。這樣會影響插入的效率 1.newsequentialid和newid 的區別 newsequentialid 和 newid 都可以產生uniq...

sql server 漢字排序

一般來講這種情況是不是出現的,但有時資料庫的字型編碼方式和顯示的編碼方式不一樣時就是有這種需求,如簡體和繁體,就會出現資料庫裡的排序和顯示的排序不對的情況,就會有這種需求,但可能情況不一樣,請自己根據自己的需求來分析,說得不到請諒解漢字!排序規則簡介 什麼叫排序規則呢?ms是這樣描述的 在 micr...

sql server 排序規則

sql server 排序規則 檢視伺服器的排序規則 select serverproperty n collation select serverproperty collation chinese prc ci as 修改資料庫的排序規則 alter database tempdb collat...