• 售前

  • 售后

热门帖子
入门百科

postgreSql分组统计数据的实当代码

[复制链接]
侬去斯 显示全部楼层 发表于 2021-10-26 12:53:25 |阅读模式 打印 上一主题 下一主题
目次


  • 1. 背景
  • 2. 需求:
  • 3. 构建数据
  • 4. 需求实现

1. 背景

好比情形台的气温监控,每半小时上报一条数据,有很多个地方的气温监控,如许数据表里就会有很多地方的差别时间的气温数据

2. 需求:

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

3. 构建数据

3.1 创建表布局:
  1. -- DROP TABLE public.t_temperature
  2. CREATE TABLE public.t_temperature (
  3.         id int4 NOT NULL GENERATED ALWAYS AS IDENTITY,
  4.         place_name varchar NOT NULL,
  5.         value float8 NOT NULL,
  6.         up_time timestamp NOT NULL,
  7.         CONSTRAINT t_temperature_pk PRIMARY KEY (id)
  8. );
  9. -- Permissions
  10. ALTER TABLE public.t_temperature OWNER TO postgres;
  11. GRANT ALL ON TABLE public.t_temperature TO postgres;
复制代码
3.2 造数据
  1. INSERT INTO public.t_temperature (place_name,value,up_time) VALUES
  2. ('广州',35,'2020-07-12 15:00:00.000')
  3. ,('广州',35.9,'2020-07-12 15:30:00.000')
  4. ,('深圳',30,'2020-07-12 15:30:00.000')
  5. ,('深圳',31,'2020-07-12 16:30:00.000')
  6. ,('三亚',23,'2020-07-12 16:30:00.000')
  7. ,('三亚',21,'2020-07-12 17:30:00.000')
  8. ,('北极',-1,'2020-07-12 17:30:00.000')
  9. ,('北极',-10,'2020-07-12 19:30:00.000')
  10. ;
复制代码
4. 需求实现

4.1 需求1的SQL语句
利用了postgreSql的一个函数:ROW_NUMBER() OVER( [ PRITITION BY col1] ORDER BY col2[ DESC ] )
  1. select
  2.         *
  3. from
  4.         (
  5.         select
  6.                 tt.place_name,
  7.                 tt.value,
  8.                 tt.up_time,
  9.                 row_number() over ( partition by tt.place_name
  10.         order by
  11.                 tt.up_time desc) as row_num
  12.         from
  13.                 t_temperature tt) aaa
  14. where
  15.         aaa.row_num = 1
复制代码
效果如下,查出的都是最新的数据:

4.2 需求2的SQL语句
利用了一个case when then else end 用法来统计数目
  1. select
  2.         dd.place_name,
  3.         sum(case when dd.value <= 0 then 1 else 0 end) as 低温天气,
  4.         sum(case when dd.value > 0 and dd.value < 25 then 1 else 0 end) as 正常天气,
  5.         sum(case when dd.value >= 25 then 1 else 0 end) as 高温天气
  6. from
  7.         t_temperature dd
  8. group by
  9.         dd.place_name
复制代码
效果如下,由于没有过滤每个地方的最新数据,查出的是所有数据:

用需求1的结果来查询统计:
  1. select
  2.         dd.place_name,
  3.         sum(case when dd.value <= 0 then 1 else 0 end) as 低温天气,
  4.         sum(case when dd.value > 0 and dd.value < 25 then 1 else 0 end) as 正常天气,
  5.         sum(case when dd.value >= 25 then 1 else 0 end) as 高温天气
  6. from
  7.         (
  8.         select
  9.                 *
  10.         from
  11.                 (
  12.                 select
  13.                         tt.place_name,
  14.                         tt.value,
  15.                         tt.up_time,
  16.                         row_number() over ( partition by tt.place_name
  17.                 order by
  18.                         tt.up_time desc) as row_num
  19.                 from
  20.                         t_temperature tt) aaa
  21.         where
  22.                 aaa.row_num = 1) dd
  23. group by
  24.         dd.place_name
复制代码
效果如下:

假如再嵌套一个sum统计,就能查出低温天气,正常天气,高温天气分别合计数目是多少了。
over,enjoy!
到此这篇关于postgreSql分组统计数据的文章就先容到这了,更多相干postgreSql分组数据内容请搜索脚本之家以前的文章或继续欣赏下面的相干文章希望各人以后多多支持脚本之家!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作