[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版]

  1. 增删改查入门。快速展现用法,代码配置连接字符串
  2. 数据模型文件。建立表格字段和索引,名字以及数据类型规范,推荐字段(时间,用户,IP)
  3. 实体类详解。数据类业务类,泛型基类,接口
  4. 功能设置。连接字符串,调试开关,SQL日志,慢日志,参数化,执行超时。代码与配置文件设置,连接字符串局部设置
  5. 反向工程。自动建立数据库数据表
  6. 数据初始化。InitData写入初始化数据
  7. 高级增删改。重载拦截,自增字段,Valid验证,实体模型(时间,用户,IP)
  8. 脏数据。如何产生,怎么利用
  9. 增量累加。高并发统计
  10. 事务处理。单表和多表,不同连接,多种写法
  11. 扩展属性。多表关联,Map映射
  12. 高级查询。复杂条件,分页,自定义扩展FieldItem,查总记录数,查汇总统计
  13. 数据层缓存。Sql缓存,更新机制
  14. 实体缓存。全表整理缓存,更新机制
  15. 对象缓存。字典缓存,适用用户等数据较多场景。
  16. 百亿级性能。字段精炼,索引完备,合理查询,充分利用缓存
  17. 实体工厂。元数据,通用处理程序
  18. 角色权限。Membership
  19. 导入导出。Xml,Json,二进制,网络或文件
  20. 分表分库。常见拆分逻辑
  21. 高级统计。聚合统计,分组统计
  22. 批量写入。批量插入,批量Upsert,异步保存
  23. 实体队列。写入级缓存,提升性能。
  24. 备份同步。备份数据,恢复数据,同步数据
  25. 数据服务。提供RPC接口服务,远程执行查询,例如SQLite网络版
  26. 大数据分析。ETL抽取,调度计算处理,结果持久化 
posted @ 2020-03-10 22:54  大石头  阅读(1768)  评论(0编辑  收藏  举报