取一行多列数据中的最大值

本文介绍了如何在SQL中找出一行多列数据中的最大值和最小值,通过行列转换实现。以学生成绩表为例,展示了查询每个学生各科最高分和最低分的方法。
部署运行你感兴趣的模型镜像

    取某一列多行的最大值我们可以直接使用max函数,但是如果取某一行多个列中最大值,则不能直接用max函数了,需要做一些转换(嗯,就是传说中的行列转换)

    下表是一个学生成绩表,我们需要得到每个学生各科成绩中的最高分和最低分

----------- ----------- ----------- ----------- ----------- -----------
|学生号    | 语文      | 数学       | 英语      |  物理      |  化学   |    
----------- ----------- ----------- ----------- ----------- -----------
|1001      | 89        |   98      |    87     |     63     |     70   |
----------- ----------- ----------- ----------- ----------- -----------
|1002      |  81       |   87      |    79     |     97     |     87   |
----------- ----------- ----------- ----------- ----------- -----------
|1003      |  65       |   86      |    65     |     87     |     84   |
----------- ----------- ----------- ----------- ----------- -----------
|1004      |  87       |   82      |    89     |     84     |     76   |
----------- ----------- ----------- ----------- ----------- -----------
|1005      |  76       |   76      |    87     |     79     |     75   |
----------- ----------- ----------- ----------- ----------- -----------
|1006      |  90       |   68      |    67     |     94     |     90   |
----------- ----------- ----------- ----------- ----------- -----------
|1007      |  56       |   65      |    86     |     69     |     77   |
----------- ----------- ----------- ----------- ----------- -----------
|1008      |  78       |   100     |    83     |     86     |     93   |
----------- ----------- ----------- ----------- ----------- -----------

    在这里,我们只需要把每个学生的各科成绩转为一列,然后再MAX最大的分数就可以了。

  1. /***测试数据***/
  2. if object_id('[tb]'is not null drop table [tb]
  3. go
  4. create table [tb]([学生号] int,[语文] int,[数学] int,[英语] int,[物理] int,[化学] int)
  5. insert [tb]
  6. select 1001,89,98,87,63,70 union all
  7. select 1002,81,87,79,97,87 union all
  8. select 1003,65,86,65,87,84 union all
  9. select 1004,87,82,89,84,76 union all
  10. select 1005,76,76,87,79,75 union all
  11. select 1006,90,68,67,94,90 union all
  12. select 1007,56,65,86,69,77 union all
  13. select 1008,78,100,83,86,93
  14. /***查询***/ 
  15. select 
  16.   学生号,
  17.   语文,
  18.   数学,
  19.   英语,
  20.   物理,
  21.   化学,
  22.   (select max(t.a) from (select 语文 as a union select 数学 union select 英语 union select 物理 union select 化学) t) as [最高分],
  23.   (select min(t.a) from (select 语文 as a union select 数学 union select 英语 union select 物理 union select 化学) t) as [最低分]
  24. from tb
  25. /***结果***/
  26. 学生号      语文        数学         英语       物理       化学      最高分   最低分         
  27. ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- 
  28. 1001        89          98          87          63          70          98          63
  29. 1002        81          87          79          97          87          97          79
  30. 1003        65          86          65          87          84          87          65
  31. 1004        87          82          89          84          76          89          76
  32. 1005        76          76          87          79          75          87          75
  33. 1006        90          68          67          94          90          94          67
  34. 1007        56          65          86          69          77          86          56
  35. 1008        78          100         83          86          93          100         78
  36. (所影响的行数为 8 行)

 

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

在 MySQL 中查询某一行数据中的最大值,可以使用 `GREATEST()` 函数。该函数接受多个参数,并返回其中的最大值。 例如,假设有一个表 `greatests` 包含字段 `key`, `X`, `Y`, `Z`,可以通过以下 SQL 查询每一行中 `X`, `Y`, `Z` 字段的最大值: ```sql SELECT `key`, GREATEST(X, Y, Z) AS `greatest` FROM greatests; ``` 如果需要对多列进行比较并获最大值,也可以嵌套使用 `GREATEST()` 函数,例如求三列之最大值: ```sql SELECT GREATEST(GREATEST(X, Y), Z) AS `greatest` FROM greatests; ``` 此外,还可以通过 `IF` 语句手动实现类似功能,比如比较三个字段 `v1`, `v2`, `v3` 的大小关系[^5]: ```sql SELECT IF(v1 > v2, IF(v1 > v3, v1, v3), IF(v2 > v3, v2, v3)) AS max_value FROM table_name; ``` 需要注意的是,`GREATEST()` 函数是 MySQL 特有的扩展,不适用于所有数据库系统(如标准 SQL 或 Oracle 数据库)。 ### 查询分组中的最大值 如果需要查询某一列的最大值,并获对应行的其他字段信息,则可以使用子查询或者 `JOIN` 操作。例如,查询每个用户的最大 `created` 值及其对应的完整数据: ```sql SELECT a.* FROM table_name a INNER JOIN ( SELECT user_id, MAX(created) AS max_created FROM table_name GROUP BY user_id ) b ON a.user_id = b.user_id AND a.created = b.max_created; ``` 此查询首先查找每个 `user_id` 对应的最大 `created` 值,然后将原始表与这个结果进行连接,从而获完整的行数据。 ### 获全表最大值 若要查询整个表中某个字段的最大值,可以直接使用 `MAX()` 函数: ```sql SELECT MAX(column_name) FROM table_name; ``` 如果需要获最大值所在行的全部数据,可以结合 `ORDER BY` 和 `LIMIT` 进行查询: ```sql SELECT * FROM table_name ORDER BY column_name DESC LIMIT 1; ``` 这种方式适用于单个字段的最大值查询,但不适用于多列比较的情况。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值