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、达梦数据库)的更多相关文章

  1. DB 查询分析器 6.03 如何灵活、快捷地操作国产达梦数据库

    DB 查询分析器 6.03 如何灵活.快捷地操作国产达梦数据库 马根峰 (广东联合电子服务股份有限公司, 广州 510300) 摘要       本文详细地介绍了"万能数据库查询分析器&qu ...

  2. sql 查询某个条件多条数据中最新的一条数据或最老的一条数据

    sql 查询某个条件下多条数据中最新的一条数据或最老的一条数据 test_user表结构如下: 需求:查询李四.王五.李二创建的最初时间或者最新时间 1:查询最初的创建时间: SELECT * FRO ...

  3. 读取大csv文件数据插入到MySql或者Oracle数据库通用处理

    import java.io.BufferedInputStream; import java.io.BufferedReader;import java.io.BufferedWriter;impo ...

  4. 关系型数据库 和 非关系型数据对比 以及 MySQL与Oracle对比

    一.关系型数据库 关系型数据库,是指采用了关系模型来组织数据的数据库.    关系模型1970年提出的,关系模型的概念得到了充分的发展并逐渐成为主流数据库结构的主流模型.    简单来说,关系模型指的 ...

  5. 数据库周刊30丨数据安全法草案将亮相;2020数据库产业报告;云南电网上线达梦;达梦7误删Redo Log;Oracle存储过程性能瓶颈;易鲸捷实践案例……

    摘要:墨天轮数据库周刊第30期发布啦,每周1次推送本周数据库相关热门资讯.精选文章.干货文档. 热门资讯 1.数据安全法草案即将亮相:将确立数据分级分类管理.应急处置制度[摘要]数据安全法草案即将在本 ...

  6. MySQL分页查询大数据量优化方法

    方法1: 直接使用数据库提供的SQL语句 语句样式: MySQL中,可用如下方法: SELECT * FROM 表名称 LIMIT M,N适应场景: 适用于数据量较少的情况(元组百/千级)原因/缺点: ...

  7. DB2大数据量优化查询解决方案

    利用DB2表分区的功能对大数据量的表进行分区,可以优化查询. 表分区介绍: 表分区是一种数据组织方案,它根据一列或多列中的值把表数据划分为多个称为数据分区 的存储对象. (我觉得表分区就类似于Wind ...

  8. C#开发BIMFACE系列16 服务端API之获取模型数据1:查询满足条件的构件ID列表

    系列目录     [已更新最新开发文章,点击查看详细] 源文件/模型转换完成之后,可以获取模型的具体数据.本篇介绍根据文件ID查询满足条件的构件ID列表. 请求地址:GET https://api.b ...

  9. easyUI datagrid 根据查询条件 选中对应数据的行

    开始 输入了 土豆,南瓜,再次是小青菜,每次输入点击搜索的时候(模糊查询),选中的当前数据对应的行 在做之前,在网上查询了许多资料,也在技术群里问过许多次,弄了好久终于好了. 第一次写博客真不知道写啥 ...

随机推荐

  1. Hadoop2.6伪分布式按照官网指点安装(1)

    参考:http://hadoop.apache.org/docs/r2.6.0/hadoop-project-dist/hadoop-common/SingleCluster.html 照抄:安装成功 ...

  2. 【JVM第七篇】执行引擎

    写在前面的话:本文是在观看尚硅谷JVM教程后,整理的学习笔记.其观看地址如下:尚硅谷2020最新版宋红康JVM教程 执行引擎是Java虚拟机中的核心组成部分. 执行引擎的作用就是解析虚拟机字节码指令, ...

  3. 【JVM第二篇--类加载机制】类加载器与双亲委派模型

    写在前面的话:本文是在观看尚硅谷JVM教程后,整理的学习笔记.其观看地址如下:尚硅谷2020最新版宋红康JVM教程 一.什么是类加载器 在类加载过程中,加载阶段有一个动作是"通过一个类的全限 ...

  4. Maximum Subarray(最大连续子串)

    1 class Solution { 2 public: 3 //动态规划,维护两个变量 local[i+1]=max(array[i],local[i]+array[i+1]) 4 int Find ...

  5. App安全常见漏洞修复建议

    ios开发对自己的app做一系列的环境检测 检测Cydia是否安装 检测app是否可以编辑系统文件 检测系统是否包含可疑的文件 检测是否有可疑的app安装如:FakeCarrier, Icy, etc ...

  6. 把token放入请求头

    1.jq 2.vue.js

  7. idea中运行tomcat不能访问8080主页问题

    问题 初次使用IntelliJ IDEA,但今天在运行项目启动Tomcat后,发现无法访问Tomcat首页,出现404错误:输入http://localhost:8080时无法访问Tomcat首页,但 ...

  8. First day,beginning!

    beginning 在闲暇的时光记录当下的生活,一直是自己所期盼的: 由于种种原因(懒惰),一直未能开始,那么就从今天开始吧! 看下日期,从实习到现在一个月刚刚好: 公司很不错,师傅特别好,感觉自己是 ...

  9. IntelliJ IDEA 2020.2.3永久破解激活教程 - 2020.10.27

    申明:本教程 IntelliJ IDEA 破解补丁.激活码均收集于网络,请勿商用,仅供个人学习使用,如有侵权,请联系作者删除 不花钱 的方式 IDEA 2020.2 激活到 2089 年 注意:教程适 ...

  10. java开发两年,这些线程知识你都不知道,你怎么涨薪?

    前言 什么是线程:程序中负责执行的哪个东东就叫做线程(执行路线,进程内部的执行序列),或者说是进程的子任务. Java中实现多线程有几种方法 继承Thread类: 实现Runnable接口: 实现Ca ...