求2个查询,谢谢~

Walkline 2018-12-26 05:46:11
表里字段包括温度和时间戳,我需要查询现在时间8小时以内的记录,8小时里每个小时取第一条和第六条记录,一共取16条记录,但是当前时间这个小时内可能没有这么多记录,那么只取第一条就行

第二个查询是这样,取8小时内温度有变化的记录,比如第一条记录23度,第二条记录23度,第三条记录23.1度,第四条记录24度,那么返回数据集应该是第一条、第三条、第四条记录,因为第一条作为起始点需要保留

求大佬们解决一下,谢谢~~
...全文
348 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
Walkline 2018-12-30
  • 打赏
  • 举报
回复
引用 2 楼 吉普赛的歌 的回复:
drop table if exists t;
create table t(
id int not null AUTO_INCREMENT primary key,
wd DECIMAL(10,2),
addTime datetime
);
INSERT t (wd,addTime) values(10,'2018-12-27 03:00');
INSERT t (wd,addTime) values(10,'2018-12-27 03:01');
INSERT t (wd,addTime) values(11,'2018-12-27 03:10');
INSERT t (wd,addTime) values(12,'2018-12-27 03:12');
INSERT t (wd,addTime) values(13,'2018-12-27 03:13');
INSERT t (wd,addTime) values(14,'2018-12-27 03:20');
INSERT t (wd,addTime) values(10,'2018-12-27 04:00');
INSERT t (wd,addTime) values(10,'2018-12-27 05:01');
INSERT t (wd,addTime) values(11,'2018-12-27 06:10');
INSERT t (wd,addTime) values(12,'2018-12-27 07:12');
INSERT t (wd,addTime) values(13,'2018-12-27 08:13');
INSERT t (wd,addTime) values(23,'2018-12-27 09:20');
# 以上为测试数据

/*
1. 查询现在时间8小时以内的记录,8小时里每个小时取第一条和第六条记录,一共取16条记录,但是当前时间这个小时内可能没有这么多记录,那么只取第一条就行
*/
select * from (
select
(
SELECT COUNT(*) FROM t t2 WHERE
1=1
AND DATE_FORMAT(t1.addTime,'%Y-%m-%d %H')= DATE_FORMAT(t2.addTime,'%Y-%m-%d %H')
AND t1.id >= t2.id
) as rid
,id
,wd
,addTime
from t as t1 where t1.addTime>DATE_ADD(t1.addTime,INTERVAL -8 hour)
) as tt
where rid in (1,6);
/*
+-----+----+-------+---------------------+
| rid | id | wd | addTime |
+-----+----+-------+---------------------+
| 1 | 1 | 10.00 | 2018-12-27 03:00:00 |
| 6 | 6 | 14.00 | 2018-12-27 03:20:00 |
| 1 | 7 | 10.00 | 2018-12-27 04:00:00 |
| 1 | 8 | 10.00 | 2018-12-27 05:01:00 |
| 1 | 9 | 11.00 | 2018-12-27 06:10:00 |
| 1 | 10 | 12.00 | 2018-12-27 07:12:00 |
| 1 | 11 | 13.00 | 2018-12-27 08:13:00 |
| 1 | 12 | 23.00 | 2018-12-27 09:20:00 |
+-----+----+-------+---------------------+
*/

/*
2. 取8小时内温度有变化的记录,比如第一条记录23度,第二条记录23度,第三条记录23.1度,第四条记录24度,那么返回数据集应该是第一条、第三条、第四条记录,因为第一条作为起始点需要保留
*/
drop TEMPORARY TABLE if exists tmp;
drop TEMPORARY TABLE if exists tmp2;
CREATE TEMPORARY TABLE tmp(
rid int,
id int,
wd DECIMAL(10,2),
addTime datetime,
timeSeg int
);
CREATE TEMPORARY TABLE tmp2(
rid int,
id int,
wd DECIMAL(10,2),
addTime datetime,
timeSeg int
);

insert into tmp
select * from (
select
(
SELECT COUNT(*) FROM t t2 WHERE
1=1
AND DATE_FORMAT(t1.addTime,'%Y-%m-%d %H')= DATE_FORMAT(t2.addTime,'%Y-%m-%d %H')
AND t1.id >= t2.id
) as rid
,id
,wd
,addTime
,DATE_FORMAT(t1.addTime,'%Y%m%d%H') as timeSeg
from t as t1 where t1.addTime>DATE_ADD(t1.addTime,INTERVAL -8 hour)
) as tt
;
insert into tmp2
select * from tmp;

select
id
,wd
,addTime
from (
select a.*,case when a.rid=1 or (b.wd is not null and a.wd!=b.wd) then 1 else 0 end as r from tmp as a
left join tmp2 as b on a.timeSeg=b.timeSeg and a.rid=b.rid+1
) as tt
where tt.r=1
order by tt.timeSeg,tt.rid
;
/*
+----+-------+---------------------+
| id | wd | addTime |
+----+-------+---------------------+
| 1 | 10.00 | 2018-12-27 03:00:00 |
| 3 | 11.00 | 2018-12-27 03:10:00 |
| 4 | 12.00 | 2018-12-27 03:12:00 |
| 5 | 13.00 | 2018-12-27 03:13:00 |
| 6 | 14.00 | 2018-12-27 03:20:00 |
| 7 | 10.00 | 2018-12-27 04:00:00 |
| 8 | 10.00 | 2018-12-27 05:01:00 |
| 9 | 11.00 | 2018-12-27 06:10:00 |
| 10 | 12.00 | 2018-12-27 07:12:00 |
| 11 | 13.00 | 2018-12-27 08:13:00 |
| 12 | 23.00 | 2018-12-27 09:20:00 |
+----+-------+---------------------+
*/


谢。。。。谢谢了,我还是用代码过滤一下吧。。。。。
吉普赛的歌 2018-12-27
  • 打赏
  • 举报
回复
drop table if exists t;
create table t(
	id int not null AUTO_INCREMENT primary key,
	wd DECIMAL(10,2),
	addTime datetime
);
INSERT t (wd,addTime) values(10,'2018-12-27 03:00');
INSERT t (wd,addTime) values(10,'2018-12-27 03:01');
INSERT t (wd,addTime) values(11,'2018-12-27 03:10');
INSERT t (wd,addTime) values(12,'2018-12-27 03:12');
INSERT t (wd,addTime) values(13,'2018-12-27 03:13');
INSERT t (wd,addTime) values(14,'2018-12-27 03:20');
INSERT t (wd,addTime) values(10,'2018-12-27 04:00');
INSERT t (wd,addTime) values(10,'2018-12-27 05:01');
INSERT t (wd,addTime) values(11,'2018-12-27 06:10');
INSERT t (wd,addTime) values(12,'2018-12-27 07:12');
INSERT t (wd,addTime) values(13,'2018-12-27 08:13');
INSERT t (wd,addTime) values(23,'2018-12-27 09:20');
# 以上为测试数据

/*
1. 查询现在时间8小时以内的记录,8小时里每个小时取第一条和第六条记录,一共取16条记录,但是当前时间这个小时内可能没有这么多记录,那么只取第一条就行
*/
select * from (
select 
(
  SELECT COUNT(*) FROM t t2 WHERE 
  1=1
   AND DATE_FORMAT(t1.addTime,'%Y-%m-%d %H')= DATE_FORMAT(t2.addTime,'%Y-%m-%d %H') 
  AND t1.id >= t2.id
) as rid
,id
,wd
,addTime
from t as t1 where t1.addTime>DATE_ADD(t1.addTime,INTERVAL -8 hour)
) as tt
where rid in (1,6);
/*
+-----+----+-------+---------------------+
| rid | id | wd    | addTime             |
+-----+----+-------+---------------------+
|   1 |  1 | 10.00 | 2018-12-27 03:00:00 |
|   6 |  6 | 14.00 | 2018-12-27 03:20:00 |
|   1 |  7 | 10.00 | 2018-12-27 04:00:00 |
|   1 |  8 | 10.00 | 2018-12-27 05:01:00 |
|   1 |  9 | 11.00 | 2018-12-27 06:10:00 |
|   1 | 10 | 12.00 | 2018-12-27 07:12:00 |
|   1 | 11 | 13.00 | 2018-12-27 08:13:00 |
|   1 | 12 | 23.00 | 2018-12-27 09:20:00 |
+-----+----+-------+---------------------+
*/

/*
2. 取8小时内温度有变化的记录,比如第一条记录23度,第二条记录23度,第三条记录23.1度,第四条记录24度,那么返回数据集应该是第一条、第三条、第四条记录,因为第一条作为起始点需要保留
*/
drop TEMPORARY TABLE if exists tmp;
drop TEMPORARY TABLE if exists tmp2;
CREATE TEMPORARY  TABLE tmp(
	rid int,
	id int,
	wd DECIMAL(10,2),
	addTime datetime,
	timeSeg int
);
CREATE TEMPORARY  TABLE tmp2(
	rid int,
	id int,
	wd DECIMAL(10,2),
	addTime datetime,
	timeSeg int
);

insert into tmp
select * from (
select 
(
  SELECT COUNT(*) FROM t t2 WHERE 
  1=1
  AND DATE_FORMAT(t1.addTime,'%Y-%m-%d %H')= DATE_FORMAT(t2.addTime,'%Y-%m-%d %H') 
  AND t1.id >= t2.id
) as rid
,id
,wd
,addTime
,DATE_FORMAT(t1.addTime,'%Y%m%d%H') as timeSeg
from t as t1 where t1.addTime>DATE_ADD(t1.addTime,INTERVAL -8 hour)
) as tt
;
insert into tmp2
select * from tmp;

select 
id
,wd
,addTime
from (
select a.*,case when a.rid=1 or (b.wd is not null and a.wd!=b.wd) then 1 else 0 end as r from tmp as a 
    left join tmp2 as b on a.timeSeg=b.timeSeg and a.rid=b.rid+1
) as tt
where tt.r=1
order by tt.timeSeg,tt.rid
;
/*
+----+-------+---------------------+
| id | wd    | addTime             |
+----+-------+---------------------+
|  1 | 10.00 | 2018-12-27 03:00:00 |
|  3 | 11.00 | 2018-12-27 03:10:00 |
|  4 | 12.00 | 2018-12-27 03:12:00 |
|  5 | 13.00 | 2018-12-27 03:13:00 |
|  6 | 14.00 | 2018-12-27 03:20:00 |
|  7 | 10.00 | 2018-12-27 04:00:00 |
|  8 | 10.00 | 2018-12-27 05:01:00 |
|  9 | 11.00 | 2018-12-27 06:10:00 |
| 10 | 12.00 | 2018-12-27 07:12:00 |
| 11 | 13.00 | 2018-12-27 08:13:00 |
| 12 | 23.00 | 2018-12-27 09:20:00 |
+----+-------+---------------------+
*/
吉普赛的歌 2018-12-27
  • 打赏
  • 举报
回复
drop table if exists t;
create table t(
	id int not null AUTO_INCREMENT primary key,
	wd DECIMAL(10,2),
	addTime datetime
);
INSERT t (wd,addTime) values(10,'2018-12-27 03:00');
INSERT t (wd,addTime) values(10,'2018-12-27 03:01');
INSERT t (wd,addTime) values(11,'2018-12-27 03:10');
INSERT t (wd,addTime) values(12,'2018-12-27 03:12');
INSERT t (wd,addTime) values(13,'2018-12-27 03:13');
INSERT t (wd,addTime) values(14,'2018-12-27 03:20');
INSERT t (wd,addTime) values(10,'2018-12-27 04:00');
INSERT t (wd,addTime) values(10,'2018-12-27 05:01');
INSERT t (wd,addTime) values(11,'2018-12-27 06:10');
INSERT t (wd,addTime) values(12,'2018-12-27 07:12');
INSERT t (wd,addTime) values(13,'2018-12-27 08:13');
INSERT t (wd,addTime) values(23,'2018-12-27 09:20');
# 以上为测试数据

/*
1. 查询现在时间8小时以内的记录,8小时里每个小时取第一条和第六条记录,一共取16条记录,但是当前时间这个小时内可能没有这么多记录,那么只取第一条就行
*/
select * from (
select 
(
  SELECT COUNT(*) FROM t t2 WHERE 
  1=1
   AND DATE_FORMAT(t1.addTime,'%Y-%m-%d %H')= DATE_FORMAT(t2.addTime,'%Y-%m-%d %H') 
  AND t1.id >= t2.id
) as rid
,id
,wd
,addTime
from t as t1 where t1.addTime>DATE_ADD(t1.addTime,INTERVAL -8 hour)
) as tt
where rid in (1,6);
/*
+-----+----+-------+---------------------+
| rid | id | wd    | addTime             |
+-----+----+-------+---------------------+
|   1 |  1 | 10.00 | 2018-12-27 03:00:00 |
|   6 |  6 | 14.00 | 2018-12-27 03:20:00 |
|   1 |  7 | 10.00 | 2018-12-27 04:00:00 |
|   1 |  8 | 10.00 | 2018-12-27 05:01:00 |
|   1 |  9 | 11.00 | 2018-12-27 06:10:00 |
|   1 | 10 | 12.00 | 2018-12-27 07:12:00 |
|   1 | 11 | 13.00 | 2018-12-27 08:13:00 |
|   1 | 12 | 23.00 | 2018-12-27 09:20:00 |
+-----+----+-------+---------------------+
*/
邹小青 2018-12-27
  • 打赏
  • 举报
回复
《如何协助MySQL实现窗口函数》这篇文章介绍得方法,可以参考一下
内容概要:SSD2828QN4是一款MIPI主桥接芯片,用于连接应用处理器与传统并行LCD接口及支持MIPI从属接口的LCD驱动器。该芯片支持最高每通道1Gbps的串行链路速度,最多可配置4个数据通道,显著减少了信号数量。它支持多种接口模式,包括RGB+SPI组合接口,适用于驱动智能或非智能显示面板,并能通过命令模式和视频模式传输数据。芯片内置时钟和复位模块、外部接口、协议控制单元(PCU)、包处理单元(PPU)、错误校正码/循环冗余校验(ECC/CRC)模块、长包和命令缓冲区、D-PHY控制器、模拟收发器以及内部锁相环(PLL),确保了高效的数据传输和系统稳定性。此外,文档详细描述了芯片的引脚分配、寄存器设置、操作模式、电源序列、时序特性等关键参数,为开发者提供了全面的技术指导。 适合人群:具备一定硬件设计基础,从事嵌入式系统开发、显示技术研究的研发人员。 使用场景及目标:①实现应用处理器与MIPI兼容显示屏之间的高速数据传输;②优化显示系统的功耗表现,减少电磁干扰(EMI);③通过灵活配置不同接口模式来适应各种显示设备的需。 阅读建议:此文档面向具有一定电子工程背景的专业人士,建议读者结合实际项目需深入理解各章节内容,特别是关于寄存器配置、时序要等方面的具体说明。对于初次接触此类技术的开发者而言,建议先熟悉基本概念再逐步掌握高级功能的应用方法。

57,064

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧