查询满足条件的最新数据(逐步优化,mysql、达梦数据库)
1.条件:报警信息表sensor_warning

2.需求:
查询当前车厢的、不同设备的、所有处理未完成的、不同报警原因的、时间最新的数据集合,最后按设备id或报警时间排序
3.原始sql,不满足实际情况
SELECT
a.id,
a.sensor_type,
a.device_status,
a.train_no,
a.device_id,
a.sensor_no,
a.carriage_no,
a.process_progress,
a.handle_person,
a.create_time,
a.position,
a.update_time,
a.reason
FROM
sensor_warning AS a
JOIN (
SELECT
max( b.device_id ) AS device_id,
max( b.create_time ) AS create_time
FROM
sensor_warning AS b
WHERE
b.process_progress IN ( '0', '1' )
AND warning_type = 0
AND b.carriage_no = 'CARID-008'
GROUP BY
b.device_id
) AS m ON a.device_id = m.device_id
AND a.create_time = m.create_time
ORDER BY
a.device_id
4.为什么不满足实际情况?
上面的sql只能查出当前车厢的、不同设备的、所有处理未完成的、时间最新的数据集合。并没有根据reason分类。
而且这里reason字段中的数据还比较特殊,例举reason字段中的个别报警原因就知道了:
转向架振动超阈值:1.23m/s²;
转向架振动超阈值:0.48m/s²
车体振动超阈值:-0.24m/s²
车体振动超阈值:-0.55m/s²
我们可以看到reason中存在数值,如果按照上面的sql查询,那么上述的4条数据都会被查出来,而实际上只有两条数据才是我们想要的结果。
5.mysql解决方案
使用字符串截取函数SUBSTRING_INDEX(),按照冒号截取,因为数据中有中文冒号和英文冒号所以这里做了两次截取。
SELECT
a.device_id,
SUBSTRING_INDEX( SUBSTRING_INDEX( a.reason, ':', 1 ), ':', 1 ) reason,
max(a.create_time) AS create_time
FROM
(
SELECT
id,
sensor_type,
device_status,
train_no,
device_id,
sensor_no,
carriage_no,
process_progress,
handle_person,
create_time,
position,
update_time,
reason
FROM
sensor_warning
WHERE
process_progress IN ( '0', '1' )
AND warning_type = 0
AND carriage_no = 'CARID-008'
ORDER BY
create_time DESC
) a
GROUP BY
a.device_id,
SUBSTRING_INDEX( SUBSTRING_INDEX( a.reason, ':', 1 ), ':', 1 )
ORDER BY a.device_id
6.达梦数据库解决方案
(ps:同orcale)
然而达梦数据库中并不支持SUBSTRING_INDEX()函数,达梦这里使用substr()函数。
substr函数格式 (字符截取函数)
格式1: substr(string string, int a, int b);
格式2:substr(string string, int a) ;
解析:
格式1:
1、string 需要截取的字符串
2、a 截取字符串的开始位置(注:当a等于0或1时,都是从第一位开始截取)
3、b 要截取的字符串的长度
格式2:
1、string 需要截取的字符串
2、a 可以理解为从第a个字符开始截取后面所有的字符串。
6.1.达梦数据库解决方案1
SELECT
a.id,
a.device_id,
a.create_time,
a.reason
FROM
sensor_warning AS a
JOIN (
SELECT
b.device_id device_id,
substr( b.reason, 1, 7 ) reason,
max( b.id ) AS id,
max( b.create_time ) AS create_time
FROM
sensor_warning AS b
WHERE
process_progress IN ( '0', '1' )
AND warning_type = 0
AND carriage_no = 'CARID-008'
GROUP BY
b.device_id,
substr( b.reason, 1, 7 )
) AS m ON a.id = m.id
ORDER BY
a.create_time
6.2.达梦数据库解决方案2
SELECT
a.device_id,
substr( a.reason, 1, 7 ) reason,
max( a.create_time ) AS create_time
FROM
(
SELECT
id,
device_id,
carriage_no,
create_time,
reason
FROM
sensor_warning
WHERE
process_progress IN ( '0', '1' )
AND warning_type = 0
AND carriage_no = 'CARID-008'
) a
GROUP BY
a.device_id,
substr( a.reason, 1, 7 )
ORDER BY
a.create_time
查询满足条件的最新数据(逐步优化,mysql、达梦数据库)的更多相关文章
- DB 查询分析器 6.03 如何灵活、快捷地操作国产达梦数据库
DB 查询分析器 6.03 如何灵活.快捷地操作国产达梦数据库 马根峰 (广东联合电子服务股份有限公司, 广州 510300) 摘要 本文详细地介绍了"万能数据库查询分析器&qu ...
- sql 查询某个条件多条数据中最新的一条数据或最老的一条数据
sql 查询某个条件下多条数据中最新的一条数据或最老的一条数据 test_user表结构如下: 需求:查询李四.王五.李二创建的最初时间或者最新时间 1:查询最初的创建时间: SELECT * FRO ...
- 读取大csv文件数据插入到MySql或者Oracle数据库通用处理
import java.io.BufferedInputStream; import java.io.BufferedReader;import java.io.BufferedWriter;impo ...
- 关系型数据库 和 非关系型数据对比 以及 MySQL与Oracle对比
一.关系型数据库 关系型数据库,是指采用了关系模型来组织数据的数据库. 关系模型1970年提出的,关系模型的概念得到了充分的发展并逐渐成为主流数据库结构的主流模型. 简单来说,关系模型指的 ...
- 数据库周刊30丨数据安全法草案将亮相;2020数据库产业报告;云南电网上线达梦;达梦7误删Redo Log;Oracle存储过程性能瓶颈;易鲸捷实践案例……
摘要:墨天轮数据库周刊第30期发布啦,每周1次推送本周数据库相关热门资讯.精选文章.干货文档. 热门资讯 1.数据安全法草案即将亮相:将确立数据分级分类管理.应急处置制度[摘要]数据安全法草案即将在本 ...
- MySQL分页查询大数据量优化方法
方法1: 直接使用数据库提供的SQL语句 语句样式: MySQL中,可用如下方法: SELECT * FROM 表名称 LIMIT M,N适应场景: 适用于数据量较少的情况(元组百/千级)原因/缺点: ...
- DB2大数据量优化查询解决方案
利用DB2表分区的功能对大数据量的表进行分区,可以优化查询. 表分区介绍: 表分区是一种数据组织方案,它根据一列或多列中的值把表数据划分为多个称为数据分区 的存储对象. (我觉得表分区就类似于Wind ...
- C#开发BIMFACE系列16 服务端API之获取模型数据1:查询满足条件的构件ID列表
系列目录 [已更新最新开发文章,点击查看详细] 源文件/模型转换完成之后,可以获取模型的具体数据.本篇介绍根据文件ID查询满足条件的构件ID列表. 请求地址:GET https://api.b ...
- easyUI datagrid 根据查询条件 选中对应数据的行
开始 输入了 土豆,南瓜,再次是小青菜,每次输入点击搜索的时候(模糊查询),选中的当前数据对应的行 在做之前,在网上查询了许多资料,也在技术群里问过许多次,弄了好久终于好了. 第一次写博客真不知道写啥 ...
随机推荐
- CentOS修改镜像源头
CentOS6改为阿里镜像源: 1. cd /etc/yum.repos.d 2. mv CentOS-Base.repo CenOS-Base.repo.bak 3. wget http://mir ...
- CSS3之径向渐变
设置最终形状参数: ellipse circle 设置长半轴和短半轴 设置椭圆对称中心 设置色标 输出代码: radial-gradient(circle closest-side at ce ...
- Docker - 解决同步容器与主机时间报错:Error response from daemon: Error processing tar file(exit status 1): invalid symlink "/usr/share/zoneinfo/UTC" -> "../usr/share/zoneinfo/Asia/Shanghai"
问题背景 这里讲解了如何同步容器和主机的时间:https://www.cnblogs.com/poloyy/p/13967532.html 其中使用方法二 docker cp /etc/localti ...
- tcp 输入 简析 转载
正常来说 TCP 收消息过程会涉及三个队列: Backlog Queue sk->sk_backlog Prequeue tp->ucopy.prequeue Receive Queue ...
- java中elasticsearch7.x关于nested类型的api使用,新增+更新
0,定义esHighClient 1 @Configuration 2 public class RestClientConfig { 3 4 //类似:200.188.22.20:9300,200. ...
- bluestore的osd自启动
前言 自启动相关的文章很多,有分析的很详细的文章,这里就不做赘述,本篇讲述的是什么情况下用,怎么用的问题 使用场景 一台机器的系统盘坏了,需要重装系统,相关的一些信息没有了,但是上面的数据盘还是在的, ...
- 无所不能的Embedding4 - Doc2vec第二弹[skip-thought & tf-Seq2Seq源码解析]
前一章Doc2Vec里提到,其实Doc2Vec只是通过加入Doc_id捕捉了文本的主题信息,并没有真正考虑语序以及上下文语义,n-gram只能在局部解决这一问题,那么还有别的解决方案么?依旧是通用文本 ...
- IP地址分类的计算方法
IP地址由四段组成,每个字段是一个字节,8位,最大值是255,但实际中我们用点分十进制记法. IP地址由两部分组成,即网络地址和主机地址.网络地址表示其属于互联网的哪一个网络(常见ABC三类,以固定网 ...
- Docker学习第二天(Docker容器管理)
简介 emmmm Docker 容器管理 推荐文章:容器技术概述 run里面的子选项 1.使用run命令创建容器 docker container run -it ubuntu /bin/bash / ...
- MyBatis学习02
3.增删改查实现 select select标签是mybatis中最常用的标签之一 select语句有很多属性可以详细配置每一条SQL语句 SQL语句返回值类型.[完整的类名或者别名] 传入SQL语句 ...