[NewLife.XCode]高级统计(数据报表利器)
NewLife.XCode是一个有15年历史的开源数据中间件,支持netcore/net45/net40,由新生命团队(2002~2020)开发完成并维护至今,以下简称XCode。
整个系列教程会大量结合示例代码和运行日志来进行深入分析,蕴含多年开发经验于其中,代表作有百亿级大数据实时计算项目。
开源地址:https://github.com/NewLifeX/X (求star, 1067+)
XCode以添删改查为基础,进一步发展了数据统计与分析,本篇将作为大数据分析处理开篇!
!!阅读本文之前,建议阅读《高级查询》。
分组统计
回顾前文,所有查询的标准结构都是 Select xxx From table Where yyy Order By zzz Limit 0, 20
分组查询也不例外,仅仅是在where子句处做文章。
对于最标准的5参数查询,FindAll(String where, String order, String selects, Int64 startRowIndex, Int64 maximumRows),分组查询就写在where参数里面,直接group by字段,甚至还可以 having 。
为了减少字符串拼接的失误,常用以下扩展写法:
1,条件表达式WhereExpression后用GroupBy扩展方法,多个待排序字段作为参数
2,条件后加上字段GroupBy,该用法很接近sql写法 where enable=1 group by roleid,缺点就是不支持多个排序字段
如果这两种扩展都无法满足要求,那就直接拼接where字符串吧。
聚合函数
光有分组查询足够,往往还需要配合使用聚合函数,如 Count/Sum/Max/Min/Avg 等。
在标准数据查询中,这属于Select部分。
常用 FindAll(Expression where, PageParameter page = null, String selects = null) 中,我们把需要聚合的表达式卸载selects参数里面。
- _.ID.Count() 表示对ID字段做Count计算,默认还是映射到ID字段,计算结构取值时 list[0].ID 就是 count()值
- _.Logins.Sum() 取 Logins 字段累加,默认映射到 Logins,取结果 list[0].Logins。
- Sum(aliasName) 也可以指定别名,如果aliasName不是实体类字段,XCode无法映射,只能这样取值 list[0][aliasName]
- 最后两个是分组字段,由于运算符重载的缘故,它们不能放在第一位,可以放在第二位开始的任意位置。
最后得到的SQL语句如下:
Select Count(ID) as ID,Sum(Logins) as Logins,Max(LastLogin) as LastLogin,RoleID,DepartmentID From User Where Enable=1 Group By RoleID,DepartmentID
以上介绍了高级统计的基本用法,实际项目中需要灵活应用。
近几年工作中,经常用到多字段表达式聚合,并且根据需要写一些扩展,如Oracle中 _.Status.CaseSum(0, "S0") & _.Status.CaseSum(1, "S1") & _.Status.CaseSum(2, "S2")
CaseSum不受XCode支持,因其只能用在Oracle上,所以在应用项目里面给 FieldItem 做了一个扩展方法。
系列教程
NewLife.XCode教程系列[2019版]
- 增删改查入门。快速展现用法,代码配置连接字符串
- 数据模型文件。建立表格字段和索引,名字以及数据类型规范,推荐字段(时间,用户,IP)
- 实体类详解。数据类业务类,泛型基类,接口
- 功能设置。连接字符串,调试开关,SQL日志,慢日志,参数化,执行超时。代码与配置文件设置,连接字符串局部设置
- 反向工程。自动建立数据库数据表
- 数据初始化。InitData写入初始化数据
- 高级增删改。重载拦截,自增字段,Valid验证,实体模型(时间,用户,IP)
- 脏数据。如何产生,怎么利用
- 增量累加。高并发统计
- 事务处理。单表和多表,不同连接,多种写法
- 扩展属性。多表关联,Map映射
- 高级查询。复杂条件,分页,自定义扩展FieldItem,查总记录数,查汇总统计
- 数据层缓存。Sql缓存,更新机制
- 实体缓存。全表整理缓存,更新机制
- 对象缓存。字典缓存,适用用户等数据较多场景。
- 百亿级性能。字段精炼,索引完备,合理查询,充分利用缓存
- 实体工厂。元数据,通用处理程序
- 角色权限。Membership
- 导入导出。Xml,Json,二进制,网络或文件
- 分表分库。常见拆分逻辑
- 高级统计。聚合统计,分组统计
- 批量写入。批量插入,批量Upsert,异步保存
- 实体队列。写入级缓存,提升性能。
- 备份同步。备份数据,恢复数据,同步数据
- 数据服务。提供RPC接口服务,远程执行查询,例如SQLite网络版
- 大数据分析。ETL抽取,调度计算处理,结果持久化