DB2查詢獲取排序號

2021-09-23 00:15:41 字數 1539 閱讀 7234

相信大家都會有這樣的需求,即對一張表進行排序查詢的同時獲取排序號。那麼在使用mysql資料庫時,我們通常通過變數來實現,或者客戶端**裡進行fetch迴圈 +1操作。

而在db2資料庫裡,直接提供了獲取行號的sql語法,一條簡單的sql語句就能實現這個需求。

接下來的測試用例如下:

create table sorttest(name varchar(20),course varchar(20),score int);

insert into sorttest values('張三','語文',80);

insert into sorttest values('張三','數學',70);

insert into sorttest values('張三','英語',90);

insert into sorttest values('李四','語文',67);

insert into sorttest values('李四','數學',75);

insert into sorttest values('李四','英語',85);

當前測試表資料如下,

首先實現乙個簡單的需求,即對所有的分數從高到底進行排序,並顯示每行資料的行號。

可使用如下sql語句進行查詢:

select name, course, score, row_number() over (order by score desc) sortno 

from sorttest;

返回結果如下,

從上面的返回結果看到,查詢的結果集裡包含資料的行號。

呃,這個簡單的sql確實能夠實現排序時獲取排序號的需求,不過這麼排序好像意義並不是很明顯。

分割槽即分組的意思,分割槽排序支援按照分組欄位為單位生成相對隔離的排序號。來看下面的例子。

同樣是這張表,另外乙個需求可能要顯得有意義一些。我們把每個同學的成績按照分數進行單獨排序,並且按照分數從高到低進行編號。

這裡我們使用分割槽排序的語法來實現,如下,

select name, course, score, row_number() over (partition by name order by score desc) sortno 

from sorttest;

獲取的結果集如下,

從結果集中我們看到,排序號是按照每個同學為單位進行單獨編號的,這個看似苛刻需求在這裡只是通過乙個簡單的sql語句就實現了。

對於排序編號這點上,db2支援的還是比較強大的,sql語法使用也很方便,「小特性,大用處」,不可小視。

DB2遞迴查詢

遞迴 sql 在 db2 中通過公共表表示式 cte,common table expression 來實現。遞迴 sql 由遞迴 cte 以及對遞迴 cte 結果的查詢組成。那什麼是遞迴 cte 呢?簡言之,如果 cte 中的 fullselect 在 from 子句中引用到 cte 本身,就是遞...

DB2 物化查詢表

start db2 物化查詢表mqt materialized query tables 儲存了乙個查詢的結果,當我們查詢相關表時,db2會自動決定是使用原表還是使用物化查詢表。當資料庫中有海量資料時,使用物化查詢表可以極大的提高查詢速度。但是,有一利就有一弊,維護物化查詢表也是相當耗時的。所以,物...

db2查詢樹寫法

較oracle來說,db2的查詢樹寫法比較複雜,但是當你習慣以後,其實寫法也挺簡單的。db2要自己寫遞迴,沒有提供相應的函式 create table tree 例子 with rpl treesuperid,treeid,treename,level as select root.treesupe...