今天要來聊聊 SORTN,它會先排序,再只留前 N 列,做排行榜的時候一個函式就搞定。
SORT 的基本用法在 SORT 與 UNIQUE 講過了,這篇專門給直接搜 SORTN 的你,重點放在取前 N 名、取最後 N 名,以及名次並列的時候要怎麼留。
只想看最大的 3 筆
我手上有一張手搖飲的訂單,8 筆,有品項、通路跟杯數,放在 A1:C9:
| A | B | C | |
|---|---|---|---|
| 1 | 品項 | 通路 | 杯數 |
| 2 | 蘋果紅茶 | 門市 | 37 |
| 3 | 青茶 | 外送 | 29 |
| 4 | 青茶 | 外送 | 29 |
| 5 | 蘋果綠茶 | 門市 | 29 |
| 6 | 鮮奶茶 | 外送 | 29 |
| 7 | 冬瓜檸檬 | 門市 | 21 |
| 8 | 桂花烏龍 | 外送 | 21 |
| 9 | 蘋果烏龍茶 | 門市 | 17 |
我想看「杯數最大的 3 筆訂單」。手動做的話,先把整張表依杯數由大到小排序,再框出前 3 列複製出去,資料一更新就得重做,有點太麻煩了吧!
用 SORT 加 ARRAY_CONSTRAIN 可以做到,寫法是 ,不過要巢狀兩個函式。這時候就可以把 SORTN 派上場。
順帶一提,Excel 沒有 SORTN。365/2024 可以用 做出和下面「模式 0」一樣的結果(Excel 2021 沒有 TAKE);模式 1、2、3 在 Excel 沒有一行就能解的寫法,要自己用 FILTER、UNIQUE、RANK 湊。
SORTN
SORTN 會把範圍排序,然後只傳回前 N 列。
語法
- 範圍:要排序的資料,不含標題列。
- n:選填,要留幾列。官方說明寫的預設值是 1。
- 顯示並列模式:選填,前幾名有並列時要不要多留,有 0 到 3 四種,預設是 0。下一節會用同一份資料全部跑一遍。
- 排序欄、遞增:選填,一組一組成對往後接,和
SORT一樣。TRUE是由小到大,FALSE是由大到小。
我自己習慣把前三個參數都寫出來,即使是預設值也一樣,過一陣子回來看,才不用想「這個空的位置是什麼模式」。
第一個例子
杯數在第 3 欄,要由大到小,如果要用 SORTN 寫,就是:
依杯數由大到小,只留前 3 列
=SORTN(A2:C9, 3, 0, 3, FALSE)A2:C9:訂單資料,不含標題。3:留 3 列。0:並列模式,這裡用預設。3, FALSE:依第 3 欄(杯數)由大到小。
先手算:由大到小排是 37、29、29、29、29、21、21、17,前 3 個是 37、29、29。來看看結果:
| A | B | C | |
|---|---|---|---|
| 11 | 蘋果紅茶 | 門市 | 37 |
| 12 | 青茶 | 外送 | 29 |
| 13 | 青茶 | 外送 | 29 |
我把公式放在 A11,所以結果占 A11:C13。你應該會得到一樣的三列!杯數同為 29 的有四筆,這三列裡留下了兩筆「青茶」,另外兩筆(蘋果綠茶、鮮奶茶)就被截掉了,下一節就來看這件事。
最小的 N 筆
把最後一個 FALSE 改成 TRUE,就是取最小的。我想看杯數最少的 2 筆:
依杯數由小到大,只留前 2 列
=SORTN(A2:C9, 2, 0, 3, TRUE)由小到大是 17、21、21、29⋯⋯,前 2 個是 17 和 21:
| A | B | C | |
|---|---|---|---|
| 11 | 蘋果烏龍茶 | 門市 | 17 |
| 12 | 冬瓜檸檬 | 門市 | 21 |
21 有兩筆(冬瓜檸檬、桂花烏龍),這裡只留了先出現的冬瓜檸檬。又是並列,下面來看。
並列的時候怎麼留
前面取前 3 名,杯數 29 有四筆,但名額只有三個。第三個參數就是決定這四筆怎麼處理,我把同一條公式的模式從 0 換到 3,其他都不動。
模式 0
只留剛好 n 列,並列的後面直接截掉,就是前面的結果:蘋果紅茶、青茶、青茶。
模式 1
留 n 列之後,再把和第 n 列杯數一樣的全部補上。第 3 列是 29,四筆 29 都留:
| A | B | C | |
|---|---|---|---|
| 11 | 蘋果紅茶 | 門市 | 37 |
| 12 | 青茶 | 外送 | 29 |
| 13 | 青茶 | 外送 | 29 |
| 14 | 蘋果綠茶 | 門市 | 29 |
| 15 | 鮮奶茶 | 外送 | 29 |
模式 2
指定排序欄時,模式 2 會依排序鍵去重,每組只留一列,再取前 n 組。本例只依第 3 欄「杯數」排序,所以四筆 29 即使品項不同,也只留一筆;兩筆 21 也只留一筆。結果是:
| A | B | C | |
|---|---|---|---|
| 11 | 蘋果紅茶 | 門市 | 37 |
| 12 | 青茶 | 外送 | 29 |
| 13 | 冬瓜檸檬 | 門市 | 21 |
只排序杯數時,品項不同也可能被去掉。如果再指定第二個排序欄,去重會看整組排序鍵;不能把模式 2 一概理解成整列去重。
若要「整列相同才去重,再取杯數最大的 3 列」,先用 UNIQUE,再交給模式 0:
先按完整資料列去重,再取杯數最大的 3 列
=SORTN(UNIQUE(A2:C9), 3, 0, 3, FALSE)這條才會保留蘋果紅茶 37、青茶 29、蘋果綠茶 29。
模式 3
只以杯數為排序鍵時,這個模式看的是「不同杯數的名次」:杯數最大的是第 1 名(37),再來是第 2 名(29,四筆都算),再來是第 3 名(21,兩筆),把名次在前 3 的全部留下。所以結果不是 3 列,而是 7 列:
| A | B | C | |
|---|---|---|---|
| 11 | 蘋果紅茶 | 門市 | 37 |
| 12 | 青茶 | 外送 | 29 |
| 13 | 青茶 | 外送 | 29 |
| 14 | 蘋果綠茶 | 門市 | 29 |
| 15 | 鮮奶茶 | 外送 | 29 |
| 16 | 冬瓜檸檬 | 門市 | 21 |
| 17 | 桂花烏龍 | 外送 | 21 |
怎麼選
四個模式的結果列數不一樣:模式 0 是 3 列、模式 2 是 3 列、模式 1 是 5 列、模式 3 是 7 列。如果結果下面還有東西,要預留空間,不然會被擋成 #REF!,這個在 進階陷阱 有講。
我自己做「前 N 名排行榜」多半選模式 1:先取最多 N 列,第 N 列有人並列時再一起保留。需要「前 N 個不同排序鍵」,並保留這些鍵的全部資料列時,才用模式 3。增加排序欄也會改變並列的判斷。
模式 0 的特色是結果最多 N 列,要把結果接到固定大小的版面(例如海報的前 3 名)時最方便。可是被截掉的是原本排在後面的那幾筆,並不是依什麼公平的規則,資料有並列的時候,要想一下這個模式合不合用。
並列時用第二層排序決定
模式 0 遇到並列,誰被截掉看的是資料原本的順序。想自己決定誰先,就多寫一組排序欄。我想看前 4 名,杯數一樣時,再依通路欄遞增排(中文依筆畫,「外」5 畫、「門」8 畫,所以「外送」排在「門市」前面):
先依杯數由大到小,杯數相同再依通路遞增
=SORTN(A2:C9, 4, 0, 3, FALSE, 2, TRUE)3, FALSE:第一層,杯數由大到小。2, TRUE:第二層,杯數相同時,依通路遞增。
杯數 29 的四筆裡有三筆外送、一筆門市,外送先排,第 4 名就是鮮奶茶,不是蘋果綠茶:
| A | B | C | |
|---|---|---|---|
| 11 | 蘋果紅茶 | 門市 | 37 |
| 12 | 青茶 | 外送 | 29 |
| 13 | 青茶 | 外送 | 29 |
| 14 | 鮮奶茶 | 外送 | 29 |
沒有第二層的時候,同樣取前 4 名,第 4 名會是蘋果綠茶(原本的順序)。排序欄成對怎麼往後接,在 SORT 與 UNIQUE 的多欄排序那節有講。
如果還要在整張榜單標出 1、2、2、4 這種並列後跳號的名次,名次欄要另外計算。SORTN 處理排序與取列;金、銀、銅逐欄比較再標名次的完整案例,見 獎牌榜排序與排名。
先篩選再取前 N 名
我想看「外送」訂單杯數最多的 2 列,而且完全重複的資料只留一次。先用 FILTER 篩出外送,再由 UNIQUE 去掉整列重複,最後用 SORTN 模式 0 取前 2 列:
外送訂單裡,杯數最大的 2 列,重複的整列只留一筆
=SORTN(UNIQUE(FILTER(A2:C9, B2:B9="外送")), 2, 0, 3, FALSE)外送有四筆:青茶 29、青茶 29、鮮奶茶 29、桂花烏龍 21。去掉重複的青茶後,前 2 列是:
| A | B | C | |
|---|---|---|---|
| 11 | 青茶 | 外送 | 29 |
| 12 | 鮮奶茶 | 外送 | 29 |
若沿用模式 2 且只按杯數排序,青茶與鮮奶茶的 29 會被視為同組,結果會變成青茶 29、桂花烏龍 21。上面的 UNIQUE 寫法則只去掉整列相同的資料;同品項若杯數不同,仍是不同列,不能拿它當成「每品項只留一筆」。
FILTER 的用法在 FILTER 函式,SORTN 吃的是 FILTER 傳回的結果,不用先貼到別的儲存格。
資料裡的 n 比實際列數大時,例如 ,會把 8 列全部排好傳回,不會報錯。
動手練習
最小的 2 名,並列也要留
我想看杯數最少的 2 筆訂單,但如果第 2 名有並列,也要一起留下來。請用 SORTN 寫出來。
想看 SORTN 放進整張月報裡的用法,可以接著看 SORT 與 UNIQUE 實戰。試著把自己的排行榜換成 SORTN 吧!我是喜特先生,Mr. Sheet,我們下個教學見!
接下來可以
相關文章
查看所有文章留言討論
共 0 則留言
