假设有表如下:

+---------+--------+-------+

| article | dealer | price |

+---------+--------+-------+

| 0001 | A | 3.45 |

| 0001 | B | 3.99 |

| 0002 | A | 10.99 |

| 0003 | B | 1.45 |

| 0003 | C | 1.69 |

| 0003 | D | 1.25 |

| 0004 | D | 19.95 |

| 0004 | C | 2.97 |

+---------+--------+-------+

按article分组,求最大price,同时希望取出某article最大price时的dealer。dealer不是group by字段,标准sql里不能直接分组的同时获得该字段值。

解决办法

把dealer拼串在price后面,但是又要保证拼出来的串在比较大小时跟直接用price比较大小是一致的。

select

article,

max(concat(length(floor(price)), '-', price, '-', dealer)) as price_dealer

from shop

group by article;

结果:

+---------+--------------+

| article | price_dealer |

+---------+--------------+

| 0001 | 1-3.99-B |

| 0002 | 2-10.99-A |

| 0003 | 1-1.69-C |

| 0004 | 2-19.95-D |

+---------+--------------+

之后可以在程序中以'-'为分隔符进行拆分或者直接在sql中利用substring_index函数拆分:

select

article,

substring_index(

substring_index(

max(concat(length(floor(price)),'-', price, '-', dealer)),

'-',

2),

'-',

-1) as price,

substring_index(

max(concat(length(floor(price)), '-', price, '-', dealer)),

'-',

-1) as dealer

from shop

group by article;

结果:

+---------+-------+--------+

| article | price | dealer |

+---------+-------+--------+

| 0001 | 3.99 | B |

| 0002 | 10.99 | A |

| 0003 | 1.69 | C |

| 0004 | 19.95 | D |

+---------+-------+--------+

由于max()函数对字符串是按ascii排序而不是数值排序,这样'2.97'会大于'19.95'。为了得到正确的比较,我们在拼串的前面加上price整数部分的长度。

讨论:

mysql官方文档里给出了用lpad拼串排序的例子:

SELECT article,

SUBSTRING( MAX( CONCAT(LPAD(price,6,'0'),dealer) ), 7) AS dealer,

0.00+LEFT( MAX( CONCAT(LPAD(price,6,'0'),dealer) ), 6) AS price

FROM shop

GROUP BY article;

运行结果和我们上面用的方法的结果一样。这种方法比较简短一些。不过需要price小数部分定长和预先知道price和dealer的最大长度。

mysql 一行取最大值_mysql 分组取最大值的同时获取包含最大值的行的其他字段相关推荐

  1. oracle分组_MySQL分组取TOP,实现Oracle的ROW_NUMBER函数的功能

    Excel中分组排序只需要对数据进行升序降序,再利用if函数添加排序序号,即可筛选出分组top数据. Oracle也有row_number()函数对数据进行分组排序,而MySQL并没有此类函数,那么如 ...

  2. hive udf 分组取top1_Hive中分组取前N个值的实现-row_number()

    背景 假设有一个学生各门课的成绩的表单,应用hive取出每科成绩前100名的学生成绩. 这个就是典型在分组取Top N的需求. 解决思路 对于取出每科成绩前100名的学生成绩,针对学生成绩表,根据学科 ...

  3. mysql 去重取最大值_mysql去重取最大值,逻辑类似oracle的over(partition by)函数

    像下表一样的数据,有重复的合同号,但是我只想保留同一合同号中回款金额最大的那一行,也就是图中红框里的数据. oracle方法: 在oracle中,我们可以简单地用over(partition by)函 ...

  4. mysql数据库表空间最大值_mysql 数据库取最大值

    {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...

  5. mysql分组随机取数据_MySql分组后随机获取每组一条数据的操作

    思路:先随机排序然后再分组就好了. 1.创建表: create table `xdx_test` ( `id` int(11) not null, `name` varchar(255) defaul ...

  6. mysql tinyint 1 范围_mysql tinyint 取值范围浅析

    Tinyint占用1字节的存储空间,即8位(bit).那么Tinyint的取值范围怎么来的呢?我们先看无符号的情况.无符号的最小值即全部8位(bit)都为0,换算成十进制就是0,所以无符号的Tinyi ...

  7. mysql 1分钟前_mysql 数据库取前后几秒 几分钟 几小时 几天的语句

    取当前时间: select current_timestamp; 输出:2016-06-16 16:12:52 select now(); 输出:2016-06-16 16:12:52 取当前时间的前 ...

  8. mysql 取左_MySQL select语句从字符串左侧获取5个字符

    要从字符串的左侧获取字符数,请在MySQL中使用LEFT方法.让我们首先创建一个表-mysql> create table DemoTable ( Name varchar(100) ); 使用 ...

  9. mysql sql 取树结构_MySQL 树形结构 根据指定节点 获取其所有叶子节点

    背景说明 需求:MySQL树形结构, 根据指定的节点,获取其下属的所有叶子节点. 叶子节点:如果一个节点下不再有子节点,则为叶子节点. 问题分析 1.可以使用类似Java这种面向对象的语言,对节点集合 ...

最新文章

  1. TCP/IP / 如何进行堵塞控制?
  2. [改善Java代码]构造函数尽量简化
  3. mocha.js 生成覆盖率报告
  4. iOS - OC RunLoop 运行循环/消息循环
  5. Wordpress 自定义文章类型添加 Categoried、Tags
  6. Vue之设置背景图片
  7. 《从零开始学Swift》学习笔记(Day 62)——Core Foundation框架之内存托管对象与非托管对象...
  8. WCF把书读薄(3)——数据契约、消息契约与错误契约
  9. keli 软件支持包下载
  10. springboot实现查询手机号归属地
  11. jclasslib插件
  12. Python 的输出矩阵的一些常用设置
  13. 一,FPGA配置及文件生成烧写
  14. 真的羡慕玉自寒和烈如歌的爱情
  15. 谈下我曾经做过的一个心理健康管理系统
  16. 正确姿势临时和永久开启关闭Android的SELinux
  17. linux 串口发送 内核,使用串口线真机调试Linux内核
  18. Oracle数据库文件
  19. 基因组学两个理念:生命是序列的;生命是数字的。
  20. /prod-api/ 整合阿里云服务器 2020年12月13日 23:44:18(日记)

热门文章

  1. 【英语学习】【Level 07】U03 Amazing wonders L2 A global city
  2. 【英语学习】【WOTD】animadversion 释义/词源/示例
  3. 能不能用python开发qq_用Python写一个模拟qq聊天小程序的代码实例
  4. python中函数的可变参数_Python中函数的参数定义和可变参数
  5. mosquitto源码分析(二)
  6. 四元数插值方法Slerp/Squad/Spicv/Sping知识总结思维导图
  7. OceanBase数据库开发和运维漫谈
  8. 用例图-是外部用户(被称为参与者)所能观察到的系统功能的模型图
  9. xtrabackup备份还原MySQL数据库
  10. java程序执行的底层原理