SQL 混合排序

2021-10-12 07:06:20 字數 2954 閱讀 2521

本文的寫作思路是來自群友分享在群裡的一道練習題,筆者覺得這道題有點小難度,且這類需求也比較常見。具體的需求描述請看下圖。

咋一看,有點摸不著頭腦。既要按照 score 排序,又要考慮到 a、a-1、a-2 這種資料之間的關係並使用另一種排序規則。

據分享這道題的朋友說,實際上這是乙份店鋪的銷量資料。出題人出於某方面的考慮把錶的欄位名稱改了,name 是店鋪名稱,名稱中帶有「-」表示分店,score 是銷售額。出題人希望能依據城市、銷售額檢視各個店鋪的銷售資料,並且當存在分店時,分店能緊挨在總店後面按照 id 排序。

如果按照規則order by city,score desc排序,我們可以做到讓每個總店先按銷售額排序,但沒法保證分店能挨著總店排在一起。

id  city    name     score  

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

1 a a 100

9 a f 95

4 a a-290

2 a a-180

5 b d 85

6 b b 75

3 b c 70

10 b g 65

8 b b-150

7 b e 30

如果能夠把分店和總店標記為一組(比如從 a、a-1、a-2 提取出共同的 『a』 作為同組的標識base_name),按照規則order by city,base_name,id排序,就能把總店和分店排在一起,卻不能做到依據銷售額的從高到低展示各總店的資料。

id  city    name     score  

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

1 a a 100

2 a a-180

4 a a-290

9 a f 95

6 b b 75

8 b b-150

3 b c 70

5 b d 85

7 b e 30

10 b g 65

不過,我們只需變通一下,把總店的銷售額當成總店和分店的另乙個同組標識(和 base_name 不一樣的地方在於,這個新標識可拿來做排序),假設這個字段叫做base_score,那麼 a、a-1、a-2 對應的 base_score 都是 100,b 和 b-1 的 base_score 是 75 。

按照規則order by city,base_score,id排序就能滿足題目的要求。

在 mysql 中,使用函式substring_index()可以提取出我們想要的資料。比如,從 『a-1』 中分別提取出 『a』 和 『1』 。

select 

substring_index(

'a-1'

,'-',1

)as base,

substring_index(

'a-1'

,'-',-

1)as seq;

base seq

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

a 1

分店要獲取到總店的銷售額,只需一次自關聯就能做到,完整的 sql 實現:

with t1 as

(select*,

if(instr(name,

'-')

, substring_index(name,

'-',1)

, name

)as base_name

from

t)select

t1.id,

t1.city,

t1.name,

t1.score

from

t1 left

join t

on t.name = t1.base_name

order

by t1.city,

t.score desc

, t1.id

其中,t 是儲存原資料的表名。

最終輸出的結果 >>>

id  city    name     score  

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

1 a a 100

2 a a-180

4 a a-290

9 a f 95

5 b d 85

6 b b 75

8 b b-150

3 b c 70

10 b g 65

7 b e 30

歸併 插入混合排序演算法

這裡列出了插入排序,歸併排序,以及歸併 插入混合排序的演算法並測試了三種排序在最壞情況下的運算速度比較。結果表明歸併 插入混合排序是優於前兩者的。但是混合排序在選擇切換臨界值時,並不是簡單比較在前兩種演算法在不同序列長度下的快慢,因為歸併排序在臨界值附近過分割,反而會降低效率。不過我也沒找到更好的方...

python多欄位,混合排序

利用佇列來實現,可以滿足任意多個字段,任意公升序和降序的排序的場景,比如 按照a欄位公升序,b欄位降序,c欄位公升序 asc公升序 desc降序 unsorted list 2 3 4 5 6 7 8 9 具體實現 def comprex sort index list self,sort feil...

各種排序混合 氣泡排序 選擇排序 插入排序

氣泡排序 不多說,看 就是把最大的數字或者最小的數字沉到最右邊,最後輸出陣列 include include includeusing namespace std int main 輸入你要排序的數字 for int i 0 ia j 1 如果左邊的數字比右邊大,交換兩個數字的位置,這一塊也可用函式...