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

2. 需求:

  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
	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
		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 高温天气
	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 高温天气
	select
		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
			t_temperature tt) aaa
	where
		aaa.row_num = 1) dd
group by
	dd.place_name

效果如下:
在这里插入图片描述
假如再嵌套一个sum统计,就能查出低温天气,正常天气,高温天气分别合计数量是多少了。

over,enjoy!

目录1. 背景2. 需求:3. 构建数据3.1 创建表结构:3.2 造数据4. 需求实现4.1 需求1的SQL语句4.2 需求2的SQL语句1. 背景比如气象台的气温监控,每半小时上报一条数据,有很多个地方的气温监控,这样数据表里就会有很多地方的不同时间的气温数据2. 需求:每次查询只查最新的气温数据按照不同的温度区间来分组查出,比如:高温有多少地方,正常有多少地方,低温有多少地方3. 构建数据3.1 创建表结构:-- DROP TABLE public.t_temperatureC
每条数据的编号:row_number() 分组排序:over(partition by 分组的字段 order by 排序的字段) num=1:对分组后的数据获取第一条,也就是最新一条 SELECT * FROM (SELECT ROW_NUMBER() over(PARTITION BY code ORDER BY create_time DESC ) AS num, * FROM t_goods) aa WHERE 1 = 1 AND aa.num = 1 ORDER BY aa.create_time
FROM public.tb_attendance_model WHERE create_time >= '2019-06-17 00:00:00.000000' AND create_time < '2020-06-17 00:00:00.000000' 相同visitnumber有多条数据时,选择时间最新的一条数据。 select patientid,visitnumber,obssitename,findings,obsdiagtext,lastupdatedttm , max(lastupdatedttm) over(partition by visitnumbe...
本文将对一个任意范围按ID分组查出每个ID对应的最新记录的CASE做一个极致的优化体验。 优化后性能维持在可控范围内,任意数据量,毫秒级返回,性能平稳可控。 比优化前性能提升1万倍。 有一张数据表,结构: CREATE TABLE target_position ( target_id varchar(80), time big...
今天在工作中,遇到一个业务:根据某个字段去重查询最新的记录列表,于是建了一张测试表(以下使用postgreSQL建表语句),并记录下三种不同类型数据库下的查询方式(oracle/postgreSQL/mysql) DROP TABLE IF EXISTS "public"."t_group_member"; CREATE TABLE "public"."t_group_member" ( "id" int4 NOT NULL, "group_id" varchar(255) COLLATE "pg_
- `timestamp`:存储日期和时间,带有时区信息。精度可以是毫秒,微秒或纳秒。 - `timestamptz`:与 `timestamp` 类似,但存储的是本地时间,并自动转换为 UTC 时间。 - `date`:存储日期,不包含时间和时区信息。 - `time`:存储时间,不包含日期和时区信息。精度可以是毫秒,微秒或纳秒。 - `interval`:存储时间间隔,可以表示两个时间点之间的差值。 你可以根据你的需要选择适当的时间数据类型。