• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    postgreSql分组统计数据的实现代码

    1. 背景

    比如气象台的气温监控,每半小时上报一条数据,有很多个地方的气温监控,这样数据表里就会有很多地方的不同时间的气温数据

    2. 需求:

    每次查询只查最新的气温数据按照不同的温度区间来分组查出,比如:高温有多少地方,正常有多少地方,低温有多少地方

    3. 构建数据

    3.1 创建表结构:

    -- DROP TABLE public.t_temperature
    
    CREATE TABLE public.t_temperature (
    	id int4 NOT NULL GENERATED ALWAYS AS IDENTITY,
    	place_name varchar NOT NULL,
    	value float8 NOT NULL,
    	up_time timestamp NOT NULL,
    	CONSTRAINT t_temperature_pk PRIMARY KEY (id)
    );
    
    -- Permissions
    
    ALTER TABLE public.t_temperature OWNER TO postgres;
    GRANT ALL ON TABLE public.t_temperature TO postgres;

    3.2 造数据

    INSERT INTO public.t_temperature (place_name,value,up_time) VALUES 
    ('广州',35,'2020-07-12 15:00:00.000')
    ,('广州',35.9,'2020-07-12 15:30:00.000')
    ,('深圳',30,'2020-07-12 15:30:00.000')
    ,('深圳',31,'2020-07-12 16:30:00.000')
    ,('三亚',23,'2020-07-12 16:30:00.000')
    ,('三亚',21,'2020-07-12 17:30:00.000')
    ,('北极',-1,'2020-07-12 17:30:00.000')
    ,('北极',-10,'2020-07-12 19:30:00.000')
    ;

    4. 需求实现

    4.1 需求1的SQL语句

    利用了postgreSql的一个函数:ROW_NUMBER() OVER( [ PRITITION BY col1] ORDER BY col2[ DESC ] )

    select
    	*
    from
    	(
    	select
    		tt.place_name,
    		tt.value,
    		tt.up_time,
    		row_number() over ( partition by tt.place_name
    	order by
    		tt.up_time desc) as row_num
    	from
    		t_temperature tt) aaa
    where
    	aaa.row_num = 1

    效果如下,查出的都是最新的数据:

    4.2 需求2的SQL语句

    利用了一个case when then else end 用法来统计数量

    select
    	dd.place_name,
    	sum(case when dd.value = 0 then 1 else 0 end) as 低温天气,
    	sum(case when dd.value > 0 and dd.value  25 then 1 else 0 end) as 正常天气,
    	sum(case when dd.value >= 25 then 1 else 0 end) as 高温天气
    from
    	t_temperature dd
    group by
    	dd.place_name

    效果如下,因为没有过滤每个地方的最新数据,查出的是所有数据:

    用需求1的结果来查询统计:

    select
    	dd.place_name,
    	sum(case when dd.value = 0 then 1 else 0 end) as 低温天气,
    	sum(case when dd.value > 0 and dd.value  25 then 1 else 0 end) as 正常天气,
    	sum(case when dd.value >= 25 then 1 else 0 end) as 高温天气
    from
    	(
    	select
    		*
    	from
    		(
    		select
    			tt.place_name,
    			tt.value,
    			tt.up_time,
    			row_number() over ( partition by tt.place_name
    		order by
    			tt.up_time desc) as row_num
    		from
    			t_temperature tt) aaa
    	where
    		aaa.row_num = 1) dd
    group by
    	dd.place_name

    效果如下:

    假如再嵌套一个sum统计,就能查出低温天气,正常天气,高温天气分别合计数量是多少了。

    over,enjoy!

    到此这篇关于postgreSql分组统计数据的文章就介绍到这了,更多相关postgreSql分组数据内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    您可能感兴趣的文章:
    • postgresql 计算两点距离的2种方法小结
    • postgresql 计算距离的实例(单位直接生成米)
    • postgresql 除法保留小数位的实例
    • PostgreSQL 性能优化之服务器参数配置操作
    • Postgresql的select优化操作(快了200倍)
    • Postgresql 动态统计某一列的某一值出现的次数实例
    上一篇:postgresql 实现数据的导入导出
    下一篇:postgresql插入后返回id的操作
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    postgreSql分组统计数据的实现代码 postgreSql,分组,统计数据,