前言

最近项目中需要做统计,各种分组和取数逻辑,搞得头大,今天介绍一下,主要用到的三个函数(数据库为postgre)。
需求介绍:需要统计30天内每家区域公司的每天的第一条数据的总数。

代码

首先查询所有的

select c.code,h.time
from tb_company c left join tb_company_data h on c.code = h.code where c.level = '1' 
and to_char(h.time, 'yyyy-mm-dd') BETWEEN '2020-07-05' AND '2020-08-03' and h.risk_rank = '3' 

然后按照区域公司分组和时间排序用到
ROW_NUMBER() OVER (PARTITION BY 分组字段 ORDER BY 排序字段) 这个函数可以根据需求分组然后排序,然后多出排序列。

select c.code,h.time,ROW_NUMBER() OVER (PARTITION BY c.code ORDER BY to_char(h.time, 'yyyy-mm-dd')) NewIndex  
from tb_company c left join tb_company_data h on c.code = h.ode where c.level = '1' 
and to_char(h.time, 'yyyy-mm-dd') BETWEEN '2020-07-05' AND '2020-08-03' and h.risk_rank = '3'

还需要时间基准,因为一个月内的时间不一定都存在。下面这个sql可以查询出给定时间内的所有日期。

select to_char(generate_series(to_date('2020-07-05','yyyy-mm-dd')::date,to_date('2020-08-03','yyyy-mm-dd'),'1 day'),'yyyy-mm-dd') as data


最后在利用count时,当分组不存在时,会发现输出的结果为null,在postgre中可以利用判空函数COALESCE(字段名称, 字段为空赋值)。

总结

其实最好用的还是分组那个函数,排好序可以根据需求取前n条数据。postgre和mysql还是有很多区别的,日期函数我就搞了好久。最后大家取count()时如果有分组,当分组不存在时,count()出的结果会是null,需要手动判空取0。

更多推荐

postgre统计数据用到的sql函数(分组,日期,判空)