专栏首页SQL实现SQL 获取一行中多个字段的最大值

SQL 获取一行中多个字段的最大值

需求描述:

chaos(id,v1,v2,v3) 表中获取每个 id 对应的 v1、v2、v3 字段的最大值,v1、v2、v3 同为数值类型。

chaos 表的数据 >>>

    id      v1      v2      v3  
------  ------  ------  --------
     1     100      80       102
     2       2     -20        -1
     3     999      12       111
     4    1234    2222      -123
     5     871     888       666
     6    -210       9      1024
     7       0      -1         0
     8       2       2         2

要查询的结果 >>>

    id   v_max  
------  --------
     1       102
     2         2
     3       999
     4      2222
     5       888
     6      1024
     7         0
     8         2

熟悉 MySQL 的函数的朋友,应该想得到,使用GREATEST() 函数就能完成这个需求。

SELECT 
  id,
  GREATEST(v1, v2, v3) AS v_max 
FROM
  chaos

是不是太简单了点?是的,确实如此。

如果没有GREATEST() 函数呢?可以试试用嵌套的 IF 语句实现。

SELECT 
  id,
  IF(
    IF(v1 > v2, v1, v2) > v3,
    IF(v1 > v2, v1, v2),
    v3
  ) AS v_max 
FROM
  chaos

表达式 IF(v1 > v2, v1, v2) 是要求得在 v1、v2 之间较大的那个值,再用求得的值和 v3 作比较。也可以把嵌套的 IF 语句看成是下面这两个 IF 语句的组合。

v12 = IF(v1 > v2, v1, v2)
v_max = IF(v12 > v3, v12, v3)

如果 chaos 再增加两个数值列 v4、v5,要同时比较这五个字段的值,嵌套的 IF 语句将变得异常复杂,且难以理解。

那么,有没有比较简单且通用的实现呢?

有。先使用 UNION ALL 把每个字段的值合并在一起,再根据 id 分组求得最大值。

WITH chaos_union AS 
(SELECT 
  id,
  v1 AS v 
FROM
  chaos 
UNION ALL 
SELECT 
  id,
  v2 AS v 
FROM
  chaos 
UNION ALL 
SELECT 
  id,
  v3 AS v 
FROM
  chaos)
SELECT 
  id,
  MAX(v) AS v_max 
FROM
  chaos_union 
GROUP BY id 

要是,不想对每个字段都用 UNION ALL 呢,还有没有办法?

那就试试用递归的方式解决。下面仅提供用递归的思路(MySQL 环境),具体实现就留给大家了。

  1. 使用 CONCAT_WS() 函数将 v1、v2、v3 的值组合成使用逗号分割的字符串;
  2. 在递归语句使用 SUBSTRING_INDEX() 根据逗号分解字符串的每个数值;
  3. 根据 id 分组求得最大值。

本文分享自微信公众号 - SQL实现(gh_684ee9235a26),作者:zero

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-11-30

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • sql server 获取每一个类别中值最大的一条数据

    数据如下: name val memo a 2 a2(a的第二个值) a 1 a1--a的第一个值 a 3 a3:a的第三...

    java达人
  • sql server 获取每一个类别中值最大的一条数据

    SELECT  * FROM    (           SELECT    * ,                     ROW_NUMBER() OVE...

    跟着阿笨一起玩NET
  • Java中获取一个数组的最大值和最小值

    3,然后对数组进行遍历循环,若循环到的元素比最大值还要大,则将这个元素赋值给最大值;同理,若循环到的元素比最小值还要小,则将这个元素赋值给最小值;

    程序员的时光001
  • 获取一个字符串中出现最多的字符和他的个数

    function isMax (STR) { let obj = {}; let arr = []; for (let item of STR)...

    李文杨
  • Elasticsearch中将Doc根据A字段排序获得第一个Doc的B字段值的方法

    最近遇到这样一个需求,要通过Elasticsearch将Doc根据A字段降序,然后获得B字段的值,最终根据B字段的值再去做Pipeline Aggregatio...

    颇忒脱
  • Excel公式技巧73:获取一列中长度最大的数据值

    在《Excel公式技巧72:获取一列中单元格内容的最大长度》中,我们使用一个简单的数组公式:

    fanjy
  • 多个探针对应同一个基因取最大值的代码进化历史

    最近全国巡讲的学员又问到了多个探针对应同一个基因取最大值类似的问题,我们的斯老师找到了我三年前的博客:多个探针对应一个基因,取平均值或者最大值 我看到里面的留言...

    生信技能树
  • 问与答83: 如何从一行含有空值的区域中获取第n个数值?

    Q:在如下图1所示,在单元格区域G3:L3中有一组分数,但是其间存在空单元格。现在我想在单元格B3至F3中使用公式来获取分数,其中单元格B3中是G3:L3中的第...

    fanjy
  • 问与答81: 如何求一组数据中满足多个条件的最大值?

    Q:在工作表中有一些数据,如下图1所示,我想要获取“参数3”等于“A”、”参数4“等于”C1“对应的”参数5”中的最大值,能够使用公式解决吗?

    fanjy
  • Oracle 一张表里面按照一个字段值将所有的数据按逗号拆分,变为多行数据

    业务:把nums按逗号拆分为多行。 REGEXP_SUBSTR函数格式如下: function REGEXP_SUBSTR(String, pattern,...

    一天不写程序难受
  • GenerateTableFetch

    该处理器用于生成在表中执行分页查询的SQL 查询语句,分区(属性partition)大小以及表的行数决定页面的大小和数量以及生成的流文件。此外,可以通过设置最大...

    用户5475193
  • ❤️ 爆肝3天!两万字图文 SQL 零基础入门,不怕你学不会,就怕你不收藏!❤️

    SQL语言有40多年的历史,从它被应用至今几乎无处不在。我们消费的每一笔支付记录,收集的每一条用户信息,发出去的每一条消息,都会使用数据库或与其相关的产品来存储...

    Lucifer三思而后行
  • 常见优化方法及慢查询

    select ...from table where exist (子查询);

    meihuasheng
  • SQL注入

     其中,un和pwd都是String类型的变量,这是一个很明显的SQL注入漏洞,假设我令

    mathor
  • 整个SQL语句的执行效率都靠它了...

    优化器是数据库最核心的功能,也是最复杂的一部分。它负责将用户提交的SQL语句根据各种判断标准,制定出最优的执行计划,并交由执行器来最终执行。优化器算法的好坏、能...

    朱小五
  • 在PHP中使用MySQL Mysqli操作数据库 ,以及类操作方法

    先来操作函数部分,普遍的MySQL 函数方法,但随着PHP5的发展,有些函数使用的要求加重了,有些则将废弃不用,有些则参数必填...

    书童小二
  • Django学习笔记之Django ORM相关操作

    <!-- p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px "PingFang SC"; color: ...

    Jetpropelledsnake21
  • 执行计划中各字段各模块描述

          在SQL语句的执行计划中,包含很多字段项和很多模块,其不同字段代表了不同的含义且在不同的情形下某些字段、模块显示或不显示,下 面的描述给出了执行计划...

    Leshami
  • MySQL 基本使用(下):DCL 语句和聚合函数

    DCL 比较简单,主要用于授予或收回访问数据库的权限,以及数据库事务的提交和回滚。

    学院君

扫码关注云+社区

领取腾讯云代金券