可以減少表的空余字段,減少拆表的必要,例如用戶集合可以一條記錄帶有 admin: true 屬性,其他不帶有這個屬性,而在關(guān)系數(shù)據(jù)庫中這類帶來大量空余字段的屬性最好拆表。
創(chuàng)新互聯(lián)專注于木蘭網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗。 熱誠為您提供木蘭營銷型網(wǎng)站建設(shè),木蘭網(wǎng)站制作、木蘭網(wǎng)頁設(shè)計、木蘭網(wǎng)站官網(wǎng)定制、微信小程序服務(wù),打造木蘭網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供木蘭網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。
PostgreSQL 打開 HStore 擴(kuò)展后也可以實現(xiàn)這樣的結(jié)構(gòu)。
如果覺得 admin: true 的例子太簡單,可以考慮下怎么儲存 gemspec 的內(nèi)容并讓它可索引。
這個操作的本意是什么?
你的行號是以數(shù)據(jù)表現(xiàn)有數(shù)據(jù)為準(zhǔn),還是其他的?
我猜測你應(yīng)該是主鍵ID設(shè)置的為自增字段,期間對數(shù)據(jù)又進(jìn)行過刪除操作,后面想對數(shù)據(jù)進(jìn)行分頁查詢時,想通過記錄的行號來查詢數(shù)據(jù),如果是這樣的話,這樣的更新操作作用不大,如果是其他用途的話,sql2005之后的版本對于分頁查詢有一個 row_number(order by 字段名XX) 的系統(tǒng)函數(shù),它在查詢數(shù)據(jù)時會對查詢的數(shù)據(jù)結(jié)果進(jìn)行計數(shù)(也就是行號),你可以寫一個存儲過程,便利數(shù)據(jù)表的所有數(shù)據(jù),利用這個函數(shù)的值,把他復(fù)制給你想要保存行號的字段就可以了。
前面?zhèn)z個章節(jié)我們介紹了窗口函數(shù)、滑動窗口函數(shù)的概念,接下來我們介紹一下PG支持的原生通用窗口函數(shù),總共11個(9.6版本, 中國社區(qū)官網(wǎng)文檔地址 )
1、row_number 函數(shù)
row_number函數(shù)可以給每隔數(shù)據(jù)行返回一個虛擬的自增ID,也就是相當(dāng)于給行分配一個編號,這些編號不會出現(xiàn)重復(fù),即使over()里面沒有按照字段排序字段也能正常工作,
2、rank函數(shù)
rank的官方解釋是:帶間隙的當(dāng)前行排名; 與該行的第一個同等行的row_number相同
從上面的的結(jié)果我們可以看出 rank函數(shù)和row_number一樣可以將行編號,但是號碼可能重復(fù),比如我們按照年份排序,年份相同的話rank值相同,2017年的數(shù)據(jù)rank直接跳到了7,這就相當(dāng)于上學(xué)的時候考試,用rank計算排名的話,如果同年級出現(xiàn)三個并列的第一名的話,那么計算的結(jié)果將是三個人的rank值都是第一,但是實際上的第二高的分?jǐn)?shù)的同學(xué)會被rank排名為第四名,如果我們想第二高的分?jǐn)?shù)的排名為2,我們可以使用dense_rank函數(shù);
3、dense_rank函數(shù)
從上面的結(jié)果我們可以看出dense_rank函數(shù)會把編號弄得更加緊密,中間不會出現(xiàn)像rank那樣的斷層編碼。
4、percent_rank函數(shù)
官方文檔解釋: 當(dāng)前行的相對排名=(rank- 1) / (總行數(shù) - 1) ,
??? 排名和rank值成正相關(guān) ,rank值相同的行號?percent_rank獲取的結(jié)果也一樣,返回的 結(jié)果是個小數(shù)范圍在[0,1]之間 ,可以等于0或者1
5、cume_dist函數(shù)
官方文檔解釋: 當(dāng)前行的相對排名=(rank- 1) / (總行數(shù) - 1) ,
??? 排名和rank值成正相關(guān) ,rank值相同的行號?percent_rank獲取的結(jié)果也一樣,返回的 結(jié)果是個小數(shù)范圍在[0,1]之間 ,可以等于0或者1
6、ntile函數(shù)
官方文檔解釋:從1到參數(shù)值的整數(shù)范圍,盡可能等分分區(qū),
ntile(num_buckets),num_buckets的值表示將結(jié)果集分成num_buckets組,有限填滿前面的組,最后一組可能出現(xiàn)個數(shù)不足(非等分)情況,實際上就是把每隔行分個組號。
7、lag函數(shù)
官方文檔解釋:lag( value ?anyelement?[,? offset ?integer?[,? default ?anyelement?]]),返回 value , 它在分區(qū)內(nèi)當(dāng)前行的之前 offset 個位置的行上計算;如果沒有這樣的行,返回 default 替代。 (作為 value 必須是相同類型)。? offset 和 default 都是根據(jù)當(dāng)前行計算的結(jié)果。如果忽略它們,則 offset 默認(rèn)是1, default 默認(rèn)是空值
? ? 官方文檔的解釋很晦澀難懂,我們直接使用用例執(zhí)行一下看一下數(shù)據(jù)分布就好了
從上圖可以知道當(dāng)前行的lag值是當(dāng)前行的前offset行的值,沒有的話就返回default,default不想存在的話就返回null,從數(shù)據(jù)姐過再去看官方文檔的解釋的話可能清晰很多,lag函數(shù)可以在結(jié)果集的行內(nèi)移動,經(jīng)常使用到的場景是計算今年和全年的年產(chǎn)量的差值,
8、lead函數(shù)
官方文檔解釋:lead( value ?anyelement?[,? offset ?integer?[,? default ?anyelement?]])?返回 value ,它在分區(qū)內(nèi)當(dāng)前行的之后 offset 個位置的行上計算;如果沒有這樣的行,返回 default 替代。(作為 value 必須是相同類型)。 offset 和 default 都是根據(jù)當(dāng)前行計算的結(jié)果。如果忽略它們,則 offset 默認(rèn)是1, default 默認(rèn)是空值
其實lead函數(shù)和lag函數(shù)的作用是相同的,如果lead的offset參數(shù)值為-N,那么lag的offset的參數(shù)為N的話計算結(jié)果是相同的,lag(gdp,-1)是lead(gdp,1)的替代
9、first_value、last_value、nth_value函數(shù)較為簡單不做介紹
至此我們講完了幾乎所有的窗口函數(shù),希望這五篇關(guān)于PostgreSQL的文章能對大家在平時的開發(fā)中有所幫助