[NewLife.XCode]高級(jí)統(tǒng)計(jì)(數(shù)據(jù)報(bào)表利器)
NewLife.XCode是一個(gè)有15年歷史的開源數(shù)據(jù)中間件,支持netcore/net45/net40,由新生命團(tuán)隊(duì)(2002~2020)開發(fā)完成并維護(hù)至今,以下簡(jiǎn)稱XCode。
整個(gè)系列教程會(huì)大量結(jié)合示例代碼和運(yùn)行日志來(lái)進(jìn)行深入分析,蘊(yùn)含多年開發(fā)經(jīng)驗(yàn)于其中,代表作有百億級(jí)大數(shù)據(jù)實(shí)時(shí)計(jì)算項(xiàng)目。
開源地址:https://github.com/NewLifeX/X (求star, 1067+)
XCode以添刪改查為基礎(chǔ),進(jìn)一步發(fā)展了數(shù)據(jù)統(tǒng)計(jì)與分析,本篇將作為大數(shù)據(jù)分析處理開篇!
!!閱讀本文之前,建議閱讀《高級(jí)查詢》。
分組統(tǒng)計(jì)
回顧前文,所有查詢的標(biāo)準(zhǔn)結(jié)構(gòu)都是 Select xxx From table Where yyy Order By zzz Limit 0, 20
分組查詢也不例外,僅僅是在where子句處做文章。
對(duì)于最標(biāo)準(zhǔn)的5參數(shù)查詢,F(xiàn)indAll(String where, String order, String selects, Int64 startRowIndex, Int64 maximumRows),分組查詢就寫在where參數(shù)里面,直接group by字段,甚至還可以 having 。
為了減少字符串拼接的失誤,常用以下擴(kuò)展寫法:
1,條件表達(dá)式WhereExpression后用GroupBy擴(kuò)展方法,多個(gè)待排序字段作為參數(shù)

2,條件后加上字段GroupBy,該用法很接近sql寫法 where enable=1 group by roleid,缺點(diǎn)就是不支持多個(gè)排序字段

如果這兩種擴(kuò)展都無(wú)法滿足要求,那就直接拼接where字符串吧。
聚合函數(shù)
光有分組查詢足夠,往往還需要配合使用聚合函數(shù),如 Count/Sum/Max/Min/Avg 等。
在標(biāo)準(zhǔn)數(shù)據(jù)查詢中,這屬于Select部分。

常用 FindAll(Expression where, PageParameter page = null, String selects = null) 中,我們把需要聚合的表達(dá)式卸載selects參數(shù)里面。
- _.ID.Count() 表示對(duì)ID字段做Count計(jì)算,默認(rèn)還是映射到ID字段,計(jì)算結(jié)構(gòu)取值時(shí) list[0].ID 就是 count()值
- _.Logins.Sum() 取 Logins 字段累加,默認(rèn)映射到 Logins,取結(jié)果 list[0].Logins。
- Sum(aliasName) 也可以指定別名,如果aliasName不是實(shí)體類字段,XCode無(wú)法映射,只能這樣取值 list[0][aliasName]
- 最后兩個(gè)是分組字段,由于運(yùn)算符重載的緣故,它們不能放在第一位,可以放在第二位開始的任意位置。
最后得到的SQL語(yǔ)句如下:
Select Count(ID) as ID,Sum(Logins) as Logins,Max(LastLogin) as LastLogin,RoleID,DepartmentID From User Where Enable=1 Group By RoleID,DepartmentID
以上介紹了高級(jí)統(tǒng)計(jì)的基本用法,實(shí)際項(xiàng)目中需要靈活應(yīng)用。
近幾年工作中,經(jīng)常用到多字段表達(dá)式聚合,并且根據(jù)需要寫一些擴(kuò)展,如Oracle中 _.Status.CaseSum(0, "S0") & _.Status.CaseSum(1, "S1") & _.Status.CaseSum(2, "S2")
CaseSum不受XCode支持,因其只能用在Oracle上,所以在應(yīng)用項(xiàng)目里面給 FieldItem 做了一個(gè)擴(kuò)展方法。
系列教程
NewLife.XCode教程系列[2019版]
- 增刪改查入門。快速展現(xiàn)用法,代碼配置連接字符串
- 數(shù)據(jù)模型文件。建立表格字段和索引,名字以及數(shù)據(jù)類型規(guī)范,推薦字段(時(shí)間,用戶,IP)
- 實(shí)體類詳解。數(shù)據(jù)類業(yè)務(wù)類,泛型基類,接口
- 功能設(shè)置。連接字符串,調(diào)試開關(guān),SQL日志,慢日志,參數(shù)化,執(zhí)行超時(shí)。代碼與配置文件設(shè)置,連接字符串局部設(shè)置
- 反向工程。自動(dòng)建立數(shù)據(jù)庫(kù)數(shù)據(jù)表
- 數(shù)據(jù)初始化。InitData寫入初始化數(shù)據(jù)
- 高級(jí)增刪改。重載攔截,自增字段,Valid驗(yàn)證,實(shí)體模型(時(shí)間,用戶,IP)
- 臟數(shù)據(jù)。如何產(chǎn)生,怎么利用
- 增量累加。高并發(fā)統(tǒng)計(jì)
- 事務(wù)處理。單表和多表,不同連接,多種寫法
- 擴(kuò)展屬性。多表關(guān)聯(lián),Map映射
- 高級(jí)查詢。復(fù)雜條件,分頁(yè),自定義擴(kuò)展FieldItem,查總記錄數(shù),查匯總統(tǒng)計(jì)
- 數(shù)據(jù)層緩存。Sql緩存,更新機(jī)制
- 實(shí)體緩存。全表整理緩存,更新機(jī)制
- 對(duì)象緩存。字典緩存,適用用戶等數(shù)據(jù)較多場(chǎng)景。
- 百億級(jí)性能。字段精煉,索引完備,合理查詢,充分利用緩存
- 實(shí)體工廠。元數(shù)據(jù),通用處理程序
- 角色權(quán)限。Membership
- 導(dǎo)入導(dǎo)出。Xml,Json,二進(jìn)制,網(wǎng)絡(luò)或文件
- 分表分庫(kù)。常見拆分邏輯
- 高級(jí)統(tǒng)計(jì)。聚合統(tǒng)計(jì),分組統(tǒng)計(jì)
- 批量寫入。批量插入,批量Upsert,異步保存
- 實(shí)體隊(duì)列。寫入級(jí)緩存,提升性能。
- 備份同步。備份數(shù)據(jù),恢復(fù)數(shù)據(jù),同步數(shù)據(jù)
- 數(shù)據(jù)服務(wù)。提供RPC接口服務(wù),遠(yuǎn)程執(zhí)行查詢,例如SQLite網(wǎng)絡(luò)版
- 大數(shù)據(jù)分析。ETL抽取,調(diào)度計(jì)算處理,結(jié)果持久化

浙公網(wǎng)安備 33010602011771號(hào)