MySQL查询多个版本数据只取最新版本

2023-11-03

前言

最近接到新的客户需求,在查询指标时要求相同的指标只显示一条数据,要显示的那条数据的要求如下:

1. 如果同一个指标的不同版本中有一条是处于上线状态,则显示该条数据,不管版本号是多少

2. 如果该条指标没有处于上线状态的版本,则展示最高版本的数据

3. 如果该条指标的相同版本有多条数据,则显示最新创建的那一条

由于对group by不熟悉,弄了好久才弄好。以下是可用的SQL语句:

-- 字段解释:
-- TARGET_GRP_NAME:指标名称;
-- TARGET_GRP_ID:指标组ID,相同的指标拥有共同的指标组ID;
-- ID_:指标ID,指标数据的序列号,唯一
-- TARGET_STATUS:指标状态,其中3表示上线状态
-- version:指标版本号
-- CREATE_TIME:指标的创建时间
select * from (
	select ID_, TARGET_GRP_NAME, version, TARGET_GRP_ID, TARGET_STATUS, CREATE_TIME, case when TARGET_STATUS='3' then 1 else 0 end as sort 
	from 指标信息表
	group by TARGET_GRP_ID, sort, version, CREATE_TIME 
	order by TARGET_GRP_ID, sort desc ,VERSION desc, CREATE_TIME desc
) b
group by b.TARGET_GRP_ID;

探索过程

光有一条SQL,可能并不明白是什么意思,所以在这里记一下自己的摸索过程,也算是详细说明一下实现的思路。

第一步 使用group by

需求乍一看,就是要根据指标组ID进行分组而已,于是产生了第一条SQL:

select ID_, TARGET_GRP_NAME, version, TARGET_GRP_ID, TARGET_STATUS, CREATE_TIME 
from 指标信息表 
group by target_grp_id

然后我发现,结果集中每一个指标组只显示了一条数据,而且不是我想要的那条,于是我查询了group by到底返回的是哪一条数据,得到如下结论:
group by 会返回分组内默认的第一条数据

于是我就想看看所有数据到底是怎么排序的,于是产生了第二条SQL:

select ID_, TARGET_GRP_NAME, version, TARGET_GRP_ID, TARGET_STATUS, CREATE_TIME 
from 指标信息表 
group by target_grp_id, TARGET_STATUS,version, create_time 

因为我的数据只需要根据这几个字段分组,所以我只group by了这几个字段,于是我就得到了所有的数据:

ID_ TARGET_GRP_NAME version TARGET_GRP_ID TARGET_STATUS CREATE_TIME
fe9d8f5a3a7d4dc894a743c66591e917 COPY_1101 1.0 app_index_100000000226_m 1 2019-11-01 09:49:30
03fc316f0b16423c9a73ddef70a438d3 基础指标-hzy-1106-1 1.0 app_index_100000000230_d 1 2019-11-13 11:31:59
2bf10789f6694c4abfc73f8278c11dbe 基础指标-hzy-1106-1 1.0 app_index_100000000230_d 3 2019-11-06 16:30:01
7c2c4b054f064e16b71e42840d8e1423 基础指标-hzy-1106-1 0.0 app_index_100000000230_d 7 2019-11-06 16:30:01
8e05421dd05641abbd60323702af802a 计算指标-hzy-1106 0.0 app_index_100000000231_d 1 2019-11-06 16:40:21
93d07d9cee3042d6b8d5b67b9aa5dc61 HYS_COPY_1016_006_F 1.0 app_index_100000000233_d 1 2019-10-16 11:56:17
c67fd89d9dd646849ca13b26a3007d72 HYS_COPY_1016_006_B 1.0 app_index_100000000233_d 1 2019-11-13 11:05:43

上面的结果中,有两条数据是需要好筛选的,其中我所需要的数据是这两条:

ID_ TARGET_GRP_NAME version TARGET_GRP_ID TARGET_STATUS CREATE_TIME
2bf10789f6694c4abfc73f8278c11dbe 基础指标-hzy-1106-1 1.0 app_index_100000000230_d 3 2019-11-06 16:30:01
c67fd89d9dd646849ca13b26a3007d72 HYS_COPY_1016_006_B 1.0 app_index_100000000233_d 1 2019-11-13 11:05:43

但是他们在各自的分组内并不是第一条,也就是说,group by并不会默认返回他们。于是我就想,我把他们进行排序,放到第一个不就得了?因为我的需求中状态是最优先的,他会无视版本高低的问题,所以我也引入了新的字段对他进行排序:

select ID_, TARGET_GRP_NAME, version, TARGET_GRP_ID, TARGET_STATUS, CREATE_TIME, case when target_status='3' then 1 else 0 end as sort 
from 指标信息表 
group by target_grp_id,TARGET_STATUS,version,  create_time 
order by target_grp_id, sort desc

然后我发现,基础指标-hzy-1106-1 这条数据果然排到了组内第一个;
但是随之我发现,HYS_COPY_1016_006_B这条数据的排序还是不对,但这已经不是问题了,order by再加一个字段就行:

select ID_, TARGET_GRP_NAME, version, TARGET_GRP_ID, TARGET_STATUS, CREATE_TIME, case when target_status='3' then 1 else 0 end as sort
from 指标信息表
group by target_grp_id,  TARGET_STATUS,version,  create_time
order by target_grp_id, sort desc, CREATE_TIME desc

于是我发现,数据的排序终于符合我的要求了,然后就有了最终的SQL:

select * from (
	select ID_, TARGET_GRP_NAME, version, TARGET_GRP_ID, TARGET_STATUS, CREATE_TIME, case when TARGET_STATUS='3' then 1 else 0 end as sort 
	from 指标信息表
	group by TARGET_GRP_ID, sort, version, CREATE_TIME 
	order by TARGET_GRP_ID, sort desc ,VERSION desc, CREATE_TIME desc
) b
group by b.TARGET_GRP_ID;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL查询多个版本数据只取最新版本 的相关文章

  • MySQL 中的创建/写入权限

    我的设备遇到一些权限问题SELECT INTO OUTFILE陈述 当我登录数据库并执行简单的导出命令时 例如 mysql gt select from XYZ into outfile home mropa Photos Desktop
  • 使用php插入sql数据库时出错

    我有一个带有 MySQL 插入查询的程序 sql INSERT INTO people person id name username password email salt VALUES person id name username p
  • 在 LINQ 中执行 FirstOrDefault 的替代方法

    我有一个成员资格表 用于记录用户是否是列表的成员 当用户的成员资格发生更新时 会写入新记录 并且先前的记录保持原样 从而可以维护其成员资格的历史记录 要获取用户的会员身份 需要选择他们最近的条目 下面是一些用户列表成员资格数据的示例 目的是
  • 数据读取过程中遇到致命错误

    我正在进行定期更新表扫描 Using connect1 As New MySqlConnection ConnectLocalhost serverString connect1 Open Dim cmd New MySqlCommand
  • dayname(curdate()) 不适用于 codeigniter php

    此 sql 在 phpmyadmin 中有效 但在 codeigniter php 中无效 function getProgramsHomepage data array this gt db gt select p name p star
  • 性能:cakephp-mysql 中的 UUID 与自动递增

    我正在搜索 cakePHP 生成的 UUID 32 个字符长 是否比自动增量在性能上更快 插入和选择操作的比较 我应该使用 cakePHP 生成的 UUID 还是使用 MySQL 的简单自动增量生成的 UUID 这是我发现的一个案例研究 但
  • 使用 MySQL 的 CURDATE() 或 PHP 的 date() 更快?

    使用mysql查询是不是更快 SELECT CURDATE as today 或 PHP 语句 curdate date Y m d 同样的答案是否适用于使用date VS MySQL 的NOW and CURTIME 如果您只是执行查询以
  • MySQL Tinybit(1) 通过视图的列

    我有一个连接 2 个表的视图 其中一个表具有表示布尔值的tinyint 1 类型的列 该表在连接时并不总是有条目 因此当行丢失时视图需要采用 0 false 值 我希望视图公开 TINYINT 1 类型且 NOT NULL 类型的列 因为它
  • 在内连接中重用 mysql 子查询

    我正在尝试优化查询 试图避免重复用 指示的查询 复杂查询 使用两次 结果相同 原始查询 SELECT news FROM news INNER JOIN SELECT myposter FROM SELECT COMPLEX QUERY U
  • 条件对列表的 In 子句

    有一个表 我需要通过在配对值列表中应用和条件来获取分页记录 下面是解释 假设我有一堂课Billoflading其中有各个领域 表中两个重要字段是 tenant billtype 我有一个包含值的对列表 tenant1 billtype1 t
  • 如何使用Python3.4在tornado中进行异步mysql操作?

    我现在使用Python3 4 我想在Tornado中使用异步mysql客户端 我已经发现torndb https github com bdarnell torndb但在阅读其源代码后 我认为它无法进行异步mysql操作 因为它只是封装了M
  • MySQL 组合两个查询

    我有两个 MySQL 查询 QUERY SELECT sodnik 1 FROM prihodnji krog WHERE file id 8778 AND sodnik 1 UNION SELECT sodnik 2 FROM priho
  • 使用表白名单选项更新 Debezium MySQL 连接器

    我正在使用 Debezium 0 7 5 MySQL 连接器 并且我试图了解如果我想使用以下选项更新此配置 最好的方法是什么table whitelist 假设我创建了一个连接器 如下所示 curl i X POST H Accept ap
  • mysql时间比较

    我有 job start 和 job end 时间 timediff 会给我时间差 现在我想看看这项工作是否花费了超过 2 小时 30 分钟 我如何比较它 如果我这样做 我会收到错误 timediff job start job end g
  • 转义用户数据,无需魔法引号

    我正在研究如何在来自外部世界的数据被用于应用程序控制 存储 逻辑等之前正确地对其进行转义 显然 随着 magic quote 指令在 php 5 3 0 中很快被弃用 并在 php6 中被删除 对于任何想要升级并进入新语言功能 同时维护遗留
  • Apache 子进程已退出,状态为 255

    经过大量的搜索 尝试 修复 等待和哭泣 在我放弃之前 我想为这个错误抓住最后的机会 我们正在奔跑Microsoft Windows Server 2012 Apache 2 4 6 Win64 OpenSSL 1 0 1e PHP 5 5
  • MySQL 连接器 C++ 64 位在 Visual Studio 2012 中从源代码构建

    我正在尝试建立mySQL 连接器 C 从源头在视觉工作室2012为了64 bit建筑学 我知道这取决于一些boost头文件和C 连接器 跑步CMake生成一个项目文件 但该项目文件无法编译 因为有一大堆非常令人困惑的错误 这些错误可能与包含
  • parent_id 是外键(自引用)并且为 null?

    浏览 Bill Karwin 的书 SQL Antipatterns 第 3 章 Naive Trees 邻接表 父子关系 有一个注释表的示例 CREATE TABLE Comments comment id SERIAL PRIMARY
  • Mysql加密/存储敏感数据,

    我的 PHP 网站有以下内容 启用 SSL 饼干 session set cookie params cookieParams lifetime cookieParams path cookieParams domain secure ht
  • 如何关闭整个数据库的区分大小写

    我创建了一个包含许多脚本和许多存储过程的数据库 在这个数据库中 我们没有注意担心区分大小写 因为它对于我的本地开发计算机来说是关闭的 综上所述 我试图弄清楚如何使以下两条语句返回相同的结果 SELECT FROM companies SEL

随机推荐

  • Python学习32:计算圆周率——无穷级数法

    描述 是个超越数 圆周率的超越性否定了化圆为方这种尺规作图精确求解问题的可能性 有趣的是 可以用无穷级数表示 左边的展式是一个无穷级数 被称为莱布尼茨级数 Leibniz 这个级数收敛到 4 它通常也被称为格雷戈里 莱布尼茨级数 用以纪念莱
  • RabbitMQ的简单使用、轮询

    视频地址 首先创建一个工程 首先创建一个空的工程 在空的工程里面创建一个maven工程 加入依赖
  • 工具详解-sqlmap使用详解

    sqlmap使用详解 简介 sqlmap是一款基于python编写的渗透测试工具 在sql检测和利用方面功能强大 支持多种数据库 一 SQLMap拖库 SQLMap可以完成注入点的发现 数据库类型的确认 WebShell权限和路径的确认 拖
  • JAVA异常详解

    异常的定义 异常就是有异于常态 和正常情况不一样 有错误出现 在java中 阻止当前方法或作用域的情况 称之为异常 异常的分类 Error 是程序中无法处理的错误 表示运行应用程序中出现了严重的错误 此类错误一般表示代码运行时JVM出现问题
  • java中Collection(集合)

    文章目录 集合 Collection 一 集合的分类 二 集合的特点 三 集合的访问 四 List 1 List 接口方法 2 List的实现方式 1 List接口提供的of 方法 2 ArrayLIst 3 LinkList 3 遍历Li
  • 汇编语言(王爽第三版)实验八

    实验八 题目与个人思路 分析下面的程序 在运行前思考 这个程序可以正确返回吗 运行后再思考 为什么是这种结果 通过这个程序加深对相关内容的理解 assume cs codesg codesg segment mov ax 4c00h int
  • SAP 变更记录表 : CDHDR / CDPOS - 说明及使用

    From 1 http blog sina com cn s blog 7dce1fac01014yp2 html 2 http www cnblogs com cnlmjer archive 2012 04 18 4099808 html
  • 大数据生态组件——Hive安装及配置

    Hive安装与配置 Hive简介 Hive的安装与配置 一 Hive的启动 hive的元数据库 安装配置MySQL MySQL的开机自启操作 配置hive 二 配置hive env sh 配置hive site xml 上传mysql co
  • Android 微信H5支付,无法拉起微信支付页面

    最近我其中一个项目需要接入微信支付 实现方式是在WebView里利用Url拉起微信支付页面 但是实际操作的时候却发现始终无法拉起支付页面 最后排查了一段时间 发现原来是因为一个很简单的问题出错了 于是解决问题以后特意想把这个问题记录下来分享
  • CSS实现文字描边效果

    一 介绍 最近在一个项目的宣传页中 设计师使用了文字描边效果 之前我确实没有实现过文字的描边效果 然后我在查阅资料后 知道了实现方法 文字描边分为两种 内外双描边和单外描边 也就是指在给文字加上描边效果后 描边的方向是向内外同时占用文字空间
  • Bresenham 画圆算法原理

    文章目录 前言 Bresenham 画圆算法原理 两个近似 构造判别式 圆与网格点的关系 关系由来 关系含义 p i p i pi 递推 画圆 程序伪码 圆与网格点的关系图示 前言 首先简要介绍一下生成圆的方法 直接利用圆的方程生成圆 利用
  • CNN-LSTM回归预测模型

    使用CNN LSTM搭建一个简单的回归预测模型 对油耗数据进行预测分析 首先导入必要的包 主要用到numpy pandas matplotlib和tensorflow下面的一些网络模型 import numpy as np import p
  • Ps2018CC打开ico插件

    把ICOFormat64 8bi放到C Program Files Adobe Adobe Photoshop CC 2018 Plug ins下面即可 根据自己的安装位置调整 附上64位插件地址哈 https download csdn
  • ds18b20 控制的实现

    参考源码如下 include
  • 免费使用 GPT-4 和 GPT-3.5 新方法:无限使用,随时切换,牛逼!

    点击上方 芋道源码 选择 设为星标 管她前浪 还是后浪 能浪的浪 才是好浪 每天 10 33 更新文章 每天掉亿点点头发 源码精品专栏 原创 Java 2021 超神之路 很肝 中文详细注释的开源项目 RPC 框架 Dubbo 源码解析 网
  • 数据链路层 PPP协议

    传输数据前 需建立ppp会话 1 链路建立阶段 LCP建立 LCP一个协议 链路控制协议 2 认证阶段 可选项 PAP协议 CHAP协议 3 网络层协商协议 NCP协商 NCP协议是一堆协议总称 网络控制协议 如果三层使用IP协议 使用IP
  • 查看oracle数据库的用户名和密码 /用户解锁/创建新用户/解决ORA01034和27101

    运行 cmd 按如下输入命令 sqlplus as sysdba 以sys登陆 超级用户 sysdba alter user 用户名 account unlock 解除锁定 必须带 号 alter user 用户名 identified 密
  • anaconda基本命令

    Anaconda基本命令 文章结构 环境相关 更新 查看所有环境 创建新环境 切换环境 查看当前环境下的功能包 删除环境 下载管理 下载换源 相关包下载 jupyter notebook相关 下载 切换文件位置 切换环境 所有命令都是在an
  • 禁用 Windows 10/11 更新(可自由设置时间长短)

    禁用和恢复 Windows 更新 一 禁用 Windows 10 11 的原因 二 禁用 Windows 10 11 更新 三 恢复 Windows 10 11 更新 一 禁用 Windows 10 11 的原因 作为一个现代化的系统 Wi
  • MySQL查询多个版本数据只取最新版本

    前言 最近接到新的客户需求 在查询指标时要求相同的指标只显示一条数据 要显示的那条数据的要求如下 1 如果同一个指标的不同版本中有一条是处于上线状态 则显示该条数据 不管版本号是多少 2 如果该条指标没有处于上线状态的版本 则展示最高版本的