相关文章推荐
睿智的柠檬  ·  位函数和操作符 | TiDB 文档中心·  2 周前    · 
酒量小的红薯  ·  sql语句查询最近七天 三十天 数据 - 元小疯 ·  2 周前    · 
胡子拉碴的凉面  ·  关键字 ‘with‘ ...·  2 周前    · 
神勇威武的滑板  ·  mybatis多对一和一对多查询数据处理解读 ...·  2 周前    · 
一直单身的鸵鸟  ·  <select>: The HTML ...·  1 周前    · 
坏坏的板栗  ·  APScheduler任务调度快速入门实践_ ...·  3 周前    · 
聪明伶俐的围巾  ·  fp = ...·  10 月前    · 
绅士的水煮肉  ·  刷题遇到‘非递减’,非递减是什么意思?不可以 ...·  1 年前    · 
飘逸的企鹅  ·  OpenMP fortran 学习 - ...·  2 年前    · 
打篮球的煎饼  ·  JAVA8新特性Optional,非空判断 ...·  2 年前    · 
Code  ›  SQL 获取一行中多个字段的最大值开发者社区
select
https://cloud.tencent.com/developer/article/1759941
耍酷的回锅肉
2 年前
作者头像
白日梦想家
0 篇文章

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

前往专栏
腾讯云
开发者社区
文档 意见反馈 控制台
首页
学习
活动
专区
工具
TVP
文章/答案/技术大牛
发布
首页
学习
活动
专区
工具
TVP
返回腾讯云官网
社区首页 > 专栏 > SQL实现 > SQL 获取一行中多个字段的最大值

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

作者头像
白日梦想家
发布 于 2020-12-14 10:00:37
3.9K 0
发布 于 2020-12-14 10:00:37
举报

需求描述:

在 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 
  GREATEST(v1, v2, v3) AS v_max 
  chaos

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

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

SELECT 
    IF(v1 > v2, v1, v2) > v3,
    IF(v1 > v2, v1, v2),
  ) AS v_max 
  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 
  v1 AS v 
  chaos 
UNION ALL 
SELECT 
  v2 AS v 
  chaos 
UNION ALL 
SELECT 
  v3 AS v 
  chaos)
SELECT 
 
推荐文章
睿智的柠檬  ·  位函数和操作符 | TiDB 文档中心
2 周前
酒量小的红薯  ·  sql语句查询最近七天 三十天 数据 - 元小疯
2 周前
胡子拉碴的凉面  ·  关键字 ‘with‘ 附近有语法错误。如果此语句是公用表表达式、xmlnamespaces 子句或者更改跟踪上下文子句,那么前一个语句必须以分号结尾_关键字 'with' 附近有语法错误。如果此语句是
2 周前
神勇威武的滑板  ·  mybatis多对一和一对多查询数据处理解读开发者社区
2 周前
一直单身的鸵鸟  ·  <select>: The HTML Select element - HTML | MDN
1 周前
坏坏的板栗  ·  APScheduler任务调度快速入门实践_apscheduler中文文档-CSDN博客
3 周前
聪明伶俐的围巾  ·  fp = builtins.open(filename, "rb")这儿一段报错怎么回事 - CSDN文库
10 月前
绅士的水煮肉  ·  刷题遇到‘非递减’,非递减是什么意思?不可以乱序_非递减顺序-CSDN博客
1 年前
飘逸的企鹅  ·  OpenMP fortran 学习 - chinagod - 博客园
2 年前
打篮球的煎饼  ·  JAVA8新特性Optional,非空判断 - Mr*宇晨 - 博客园
2 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号