前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SQL 获取一行中多个字段的最大值

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

作者头像
白日梦想家
发布2020-12-14 10:00:37
11.3K0
发布2020-12-14 10:00:37
举报
文章被收录于专栏:SQL实现SQL实现

需求描述:

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

chaos 表的数据 >>>

代码语言:javascript
复制
    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

要查询的结果 >>>

代码语言:javascript
复制
    id   v_max  
------  --------
     1       102
     2         2
     3       999
     4      2222
     5       888
     6      1024
     7         0
     8         2

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

代码语言:javascript
复制
SELECT 
  id,
  GREATEST(v1, v2, v3) AS v_max 
FROM
  chaos

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

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

代码语言:javascript
复制
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 语句的组合。

代码语言:javascript
复制
v12 = IF(v1 > v2, v1, v2)
v_max = IF(v12 > v3, v12, v3)

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

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

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

代码语言:javascript
复制
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 分组求得最大值。
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-11-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 SQL实现 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档