mysql 一行取最大值_mysql 分组取最大值的同时获取包含最大值的行的其他字段
假设有表如下:
+---------+--------+-------+
| 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 分组取最大值的同时获取包含最大值的行的其他字段相关推荐
- oracle分组_MySQL分组取TOP,实现Oracle的ROW_NUMBER函数的功能
Excel中分组排序只需要对数据进行升序降序,再利用if函数添加排序序号,即可筛选出分组top数据. Oracle也有row_number()函数对数据进行分组排序,而MySQL并没有此类函数,那么如 ...
- hive udf 分组取top1_Hive中分组取前N个值的实现-row_number()
背景 假设有一个学生各门课的成绩的表单,应用hive取出每科成绩前100名的学生成绩. 这个就是典型在分组取Top N的需求. 解决思路 对于取出每科成绩前100名的学生成绩,针对学生成绩表,根据学科 ...
- mysql 去重取最大值_mysql去重取最大值,逻辑类似oracle的over(partition by)函数
像下表一样的数据,有重复的合同号,但是我只想保留同一合同号中回款金额最大的那一行,也就是图中红框里的数据. oracle方法: 在oracle中,我们可以简单地用over(partition by)函 ...
- mysql数据库表空间最大值_mysql 数据库取最大值
{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...
- mysql分组随机取数据_MySql分组后随机获取每组一条数据的操作
思路:先随机排序然后再分组就好了. 1.创建表: create table `xdx_test` ( `id` int(11) not null, `name` varchar(255) defaul ...
- mysql tinyint 1 范围_mysql tinyint 取值范围浅析
Tinyint占用1字节的存储空间,即8位(bit).那么Tinyint的取值范围怎么来的呢?我们先看无符号的情况.无符号的最小值即全部8位(bit)都为0,换算成十进制就是0,所以无符号的Tinyi ...
- mysql 1分钟前_mysql 数据库取前后几秒 几分钟 几小时 几天的语句
取当前时间: select current_timestamp; 输出:2016-06-16 16:12:52 select now(); 输出:2016-06-16 16:12:52 取当前时间的前 ...
- mysql 取左_MySQL select语句从字符串左侧获取5个字符
要从字符串的左侧获取字符数,请在MySQL中使用LEFT方法.让我们首先创建一个表-mysql> create table DemoTable ( Name varchar(100) ); 使用 ...
- mysql sql 取树结构_MySQL 树形结构 根据指定节点 获取其所有叶子节点
背景说明 需求:MySQL树形结构, 根据指定的节点,获取其下属的所有叶子节点. 叶子节点:如果一个节点下不再有子节点,则为叶子节点. 问题分析 1.可以使用类似Java这种面向对象的语言,对节点集合 ...
最新文章
- TCP/IP / 如何进行堵塞控制?
- [改善Java代码]构造函数尽量简化
- mocha.js 生成覆盖率报告
- iOS - OC RunLoop		运行循环/消息循环
- Wordpress 自定义文章类型添加 Categoried、Tags
- Vue之设置背景图片
- 《从零开始学Swift》学习笔记(Day 62)——Core Foundation框架之内存托管对象与非托管对象...
- WCF把书读薄(3)——数据契约、消息契约与错误契约
- keli 软件支持包下载
- springboot实现查询手机号归属地
- jclasslib插件
- Python 的输出矩阵的一些常用设置
- 一,FPGA配置及文件生成烧写
- 真的羡慕玉自寒和烈如歌的爱情
- 谈下我曾经做过的一个心理健康管理系统
- 正确姿势临时和永久开启关闭Android的SELinux
- linux 串口发送 内核,使用串口线真机调试Linux内核
- Oracle数据库文件
- 基因组学两个理念:生命是序列的;生命是数字的。
- /prod-api/ 整合阿里云服务器 2020年12月13日 23:44:18(日记)
热门文章
- 【英语学习】【Level 07】U03 Amazing wonders L2 A global city
- 【英语学习】【WOTD】animadversion 释义/词源/示例
- 能不能用python开发qq_用Python写一个模拟qq聊天小程序的代码实例
- python中函数的可变参数_Python中函数的参数定义和可变参数
- mosquitto源码分析(二)
- 四元数插值方法Slerp/Squad/Spicv/Sping知识总结思维导图
- OceanBase数据库开发和运维漫谈
- 用例图-是外部用户(被称为参与者)所能观察到的系统功能的模型图
- xtrabackup备份还原MySQL数据库
- java程序执行的底层原理