sqlite 手動編寫 rank 函式

2021-10-23 16:59:09 字數 3722 閱讀 7055

專案一開始定義使用輕量級資料庫sqlite來處理資料, 用著用著發現想要做個排序功能

卻發現sqlite沒有現成的排序函式rank()等等,

使用排序後臨時表的rowid也不行, 查詢的出來的rowid是真實資料的,並不是臨時表;

這個節點換資料庫就不現實,函式不也是底層邏輯組合起來的麼, 只能自己動手豐衣足食。

本過程沒有深究 其他資料庫rank()函式的原理,主要目的是實現相同的功能,滿足基本使用。

同時也歡迎感興趣的小夥伴對 sql**進行拓展及優化

實際**,其實步驟3就已經結束,後面均是驗證。

已知:成績分數;

需求:做乙個成績排行榜

簡單分析:

1. 對成績排序,生成成績排名後插入資料;

2. 每插入一條成績,則更新排行榜。

表a 和 資料

rowid(資料庫自帶)

score

rank110

–28–

36–4

4–步驟1 獲取序列

統計比當前成績高的成績有多少, 其中a1.*是為了便於檢視資料

select

count(*

)as num,a1.rowid,a1.

*from a a1, a b1

where a1.score < b1.score

group

by a1.rowid

結果:

numrowid

score

rank12

8–23

6–34

4–步驟2 序列號 轉換成 順序

將表a 與上面查詢到的結果進行 左關聯,其中c1.*是為了便於檢視資料

with  aa2 as

(select

count(*

)as num,a1.rowid

from a a1, a b1

where a1.score < b1.score

group

by a1.rowid)

select ifnull(aa2.num,0)

+1as rankplus , c1.

*from a c1

left

join aa2 on aa2.rowid = c1.rowid

結果:

rankplus

score

rank110

–28–

36–4

4–步驟3 更新表的順序字段

將查詢到的結果更新到表a裡面

update a set rank =

(with aa2 as

(select

count(*

)as num,a1.rowid

from a a1, a b1

where a1.score < b1.score

group

by a1.rowid)

select ifnull(aa2.num,0)

+1as rankplus /*, c1.**/

from a c1

left

join aa2 on aa2.rowid = c1.rowid

where c1.rowid = a.rowid

)where score <

11

這裡需要說明下where score <11是因為update語句一定要有條件跟隨,不然會整個表的資料都更新。

步驟4 結果校驗

執行select * from a檢視下結果校驗下。

結果:rowid(資料庫自帶)

score

rank110

1282

3634

44步驟5 初步優化-更新部分資料

上述表 是結果優化,其實每插入一條資料,

有順序變更的是成績不如插入成績的那些資料

insert

into a values(7

,null);

update a set rank =

(with aa2 as

(select

count(*

)as num,a1.rowid

from a a1, a b1

where a1.score < b1.score

group

by a1.rowid)

select ifnull(aa2.num,0)

+1as rankplus /*, c1.**/

from a c1

left

join aa2 on aa2.rowid = c1.rowid

where c1.rowid = a.rowid

)where score <=7;

--和插入資料的 成績 7 保持一致

select

*from a ;

結果:

rowid(資料庫自帶)

score

rank110

1282

36444

5

57

3

步驟6 測試-插入相同成績

步驟5的指令碼再次執行一遍,即再插入一次 成績7 。

結果:rowid(資料庫自帶)

score

rank110

1282

36544

657

367

3

最終**

我這裡將rowid當作資料的唯一主鍵來使用了,

rowid會因臨時表變動而變動,則更簡單了,都可以省略步驟2中的左連線內容了

insert

into a values(7

,null);

update a set rank =

(with aa2 as

(select

count(*

)as num,a1.rowid

from a a1, a b1

where a1.score < b1.score

group

by a1.rowid)

select ifnull(aa2.num,0)

+1as rankplus /*, c1.**/

from a c1

left

join aa2 on aa2.rowid = c1.rowid

where c1.rowid = a.rowid

)where score <=7;

--和插入資料的 成績 7 保持一致

手動編寫AJAX過程

ajax 全稱 asynchronous j ascript and xml 非同步的 j ascript 和 xml 之前在學校沒認真學過,只知道ajax就代表區域性重新整理,能提高效率。最近一直接觸web方面的專案,遂到網上找了找相關知識,記錄一下。現有理解又多了一下,ajax相當於在客戶端和伺...

手動編寫C語言字串函式

c語言字串庫string.h包含很多常用的字串函式 字串長度函式strlen 字串比較函式strcmp 字串拷貝函式strcpy 字串追加函式strcat 左起尋找字元函式strchr 右起尋找字元函式strrchr 尋找字串函式strstr 忽略大小寫尋找字串函式strcasestr 乙個字串以 ...

sqlite3 編寫簡易通訊錄

以下貼出的是我用sqlite3寫的簡易通訊錄,注意編譯時鏈結上sqlite3庫,若有什麼錯誤望大牛指正 include include include include define max size 1024 static sqlite3 db null static char errmsg nul...