據(jù)透視表排序:從基礎(chǔ)到自定義排序規(guī)則完整指南)
3分鐘搞定 DBeaver 數(shù)據(jù)透視表排序從基礎(chǔ)到自定義排序規(guī)則完整指南【免費(fèi)下載鏈接】dbeaverFree universal database tool and SQL client項(xiàng)目地址: https://gitcode.com/GitHub_Trending/db/dbeaver查詢拉回來 5000 行訂單你要找哪個(gè)區(qū)域賣得最多只能靠肉眼從插表順序里撈針。這活本來不該這么干。DBeaver 數(shù)據(jù)透視表把結(jié)果集的排序、分組分析做成了點(diǎn)選操作列頭點(diǎn)一下就排多字段疊加就排兩層再不夠用還有自定義比較邏輯的位置。這篇文章按先會(huì)點(diǎn)、再會(huì)排、最后會(huì)改的順序講不寫代碼也能走完前兩步。3分鐘上手?jǐn)?shù)據(jù)透視表基礎(chǔ)排序零基礎(chǔ)版以已執(zhí)行查詢、結(jié)果網(wǎng)格亮著為前提點(diǎn)擊結(jié)果網(wǎng)格上方的透視分組/匯總按鈕進(jìn)入數(shù)據(jù)透視視圖。 為什么這么做透視視圖會(huì)把行字段、匯總字段分開排序先作用于匯總結(jié)果你看到的是歸納后的幾行而不是幾萬行。點(diǎn)擊某列的列頭該列立刻按當(dāng)前方向排序再次點(diǎn)擊同列頭方向在升序、降序之間切換。 為什么這么做列頭點(diǎn)擊走的是三態(tài)循環(huán)默認(rèn) → 升 → 降不彈任何對話框是改動(dòng)成本最低的操作適合快速試方向。點(diǎn)列頭左側(cè)的排序圖標(biāo)可以顯式指定升序或降序不用反復(fù)試探。 為什么這么做圖標(biāo)點(diǎn)擊直接落到目標(biāo)方向跳過默認(rèn)態(tài)多試一次就浪費(fèi)一次全表重排。內(nèi)置排序模式效果適合場景升序Ascending小→大A→Z編號(hào)、日期、金額從低到高核對降序Descending大→小Z→ATop-N 分析、找異常值按行號(hào)重置恢復(fù)查詢原始順序排序試錯(cuò)后想回到起點(diǎn)提示升/降序的界面文案定義在消息文件internal/ResultSetMessages.java里grouping_panel_sorting_action_ascending等鍵界面語言切換時(shí)排序菜單的文字就來自這里。多字段組合排序DBeaver 多字段組合排序的優(yōu)先級怎么調(diào)基礎(chǔ)排序搞定后常見的新問題是按區(qū)域匯總后每個(gè)區(qū)域內(nèi)還想按銷售額降序。這時(shí)單點(diǎn)列頭不夠用了。關(guān)鍵操作只有一條按住 Ctrl 再點(diǎn)列頭 升序按住 Alt 再點(diǎn)列頭 降序在已有排序基礎(chǔ)上追加一個(gè)字段。這一點(diǎn)可以直接從列頭點(diǎn)擊的處理邏輯里確認(rèn)// SpreadsheetPresentation.changeSortingCtrl/Alt 修飾鍵決定新字段的方向 controller.toggleSortOrder((DBDAttributeBinding) columnElement, ctrlPressed ? IResultSetController.ColumnOrder.ASC : (altPressed ? IResultSetController.ColumnOrder.DESC : null));調(diào)優(yōu)先級的規(guī)則先點(diǎn)的字段優(yōu)先級更高。先點(diǎn)區(qū)域升序再 Ctrl點(diǎn)銷售額降序得到的就是區(qū)域內(nèi)銷售額從高到低。想換順序就重置重來把排序圖標(biāo)點(diǎn)回未排序再按新順序逐列點(diǎn)。組合排序沒有拖動(dòng)條件上下移的可視化列表重排比記憶當(dāng)前狀態(tài)更不容易錯(cuò)。比較方向是逐字段獨(dú)立的區(qū)域升序 銷售額降序完全合法每個(gè)字段各自帶方向。自定義排序規(guī)則內(nèi)置排序不夠用時(shí)怎么辦內(nèi)置比較邏輯是按列的數(shù)據(jù)類型比較字符串忽略大小寫其他類型走通用的數(shù)據(jù)值比較。業(yè)務(wù)優(yōu)先級比如緊急 高 中 低這種非自然序它排不出來需要?jiǎng)优渲脤?。配置入口有兩個(gè)結(jié)果集過濾器對話框在結(jié)果網(wǎng)格右鍵打開過濾器/設(shè)置對話框FilterSettingsDialog.java。左側(cè)字段樹里有上移、下移、按字母排序的工具按鈕字段順序在這里重排會(huì)同步影響排序與展示位置。比較邏輯的落點(diǎn)真正執(zhí)行排序的是ResultSetModel排序前會(huì)先按行號(hào)復(fù)位原始順序再逐字段取比較器// ResultSetModel.resetOrderingImpl比較器來自值處理器找不到就退化為字符串/通用比較 ComparatorObject comparator columnElement.getValueHandler().getComparator(); if (comparator ! null) { result comparator.compare(cell1, cell2); } else if (cell1 instanceof String cell2 instanceof String) { result cell1.toString().compareToIgnoreCase(cell2.toString()); } else { result DBUtils.compareDataValues(cell1, cell2); }想要自定義比較邏輯就是替換這段鏈路上的比較器來源。對普通用戶最務(wù)實(shí)的等價(jià)做法是在 SQL 里用 CASE 寫死優(yōu)先級再讓 DBeaver 按普通升序排效果和自定義比較器一致而且能隨 SQL 保存。常見問題與避坑Q1點(diǎn)了排序結(jié)果沒變本地排序只作用于已加載到內(nèi)存的行。DBeaver 結(jié)果集有最大行數(shù)限制超出部分根本不在客戶端自然排不到。另外被過濾/隱藏的列也不參與視覺排序。Q2數(shù)據(jù)量大了之后排序卡頓排序在客戶端內(nèi)存里執(zhí)行幾萬行以內(nèi)通常無感幾十萬行開始明顯。數(shù)據(jù)量大時(shí)優(yōu)先在 SQL 里寫ORDER BY讓數(shù)據(jù)庫排完再傳輸——傳輸量不變本地排序的活就不做了。Q3排序規(guī)則能長期保存嗎不能。排序狀態(tài)跟隨當(dāng)前結(jié)果集dataFilter存在重新執(zhí)行查詢即復(fù)位。要永久生效只有兩條路把ORDER BY寫進(jìn) SQL 語句本身或把帶排序的查詢存成模板/腳本復(fù)用。Q4為什么同一列兩次點(diǎn)擊方向和我預(yù)期相反列頭點(diǎn)擊是三態(tài)循環(huán)第二次點(diǎn)不是換方向而是進(jìn)降序第三次才回到未排序。方向敏感時(shí)用圖標(biāo)顯式指定別靠連點(diǎn)。結(jié)語排序這件事在 DBeaver 里就是三檔點(diǎn)列頭試方向、Ctrl/Alt 加字段調(diào)優(yōu)先級、SQL 里的ORDER BY做最終兜底。想繼續(xù)往下讀源碼從這幾處入手結(jié)果集控制模塊模型、過濾器對話框、展示層plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/controls/resultset/多字段排序復(fù)位與比較器選擇ResultSetModel.java排序/過濾對話框交互FilterSettingsDialog.java【免費(fèi)下載鏈接】dbeaverFree universal database tool and SQL client項(xiàng)目地址: https://gitcode.com/GitHub_Trending/db/dbeaver創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考