SQL:一个分组取最大值并且去重
处理分组获取最大值后去重的问题。
要求
有一张表,字段和内容如下,
id category name click download
--------------------------------------
1 1 A 11 108
2 1 B 12 108
3 2 C 33 34
4 2 D 22 108
5 3 E 21 51
6 3 F 32 68
现在需要按category分组,每个类别只要一个结果,取download最大的那个,并且如果download
最大值有重复的,只取一个。如上表,我想要取出来的结果是:
id category name click download
--------------------------------------
1 1 A 11 108
4 2 D 22 108
6 3 F 32 68
遇到的问题:现在卡在了如果一个类别的download最大值有重复的情况下,会把最大值重复的行一起取出来。
创建表和数据
-- 创建表和数据start
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for groupbytoheavy
-- ----------------------------
DROP TABLE IF EXISTS `groupbytoheavy`;
CREATE TABLE `groupbytoheavy` (
`id` int(128) NOT NULL auto_increment,
`category` int(128) default NULL,
`name` varchar(255) default NULL,
`click` int(128) default NULL,
`download` int(128) default NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of groupbytoheavy
-- ----------------------------
INSERT INTO `groupbytoheavy` VALUES ('1', '1', 'A', '11', '108');
INSERT INTO `groupbytoheavy` VALUES ('2', '1', 'B', '12', '108');
INSERT INTO `groupbytoheavy` VALUES ('3', '2', 'C', '33', '34');
INSERT INTO `groupbytoheavy` VALUES ('4', '2', 'D', '22', '108');
INSERT INTO `groupbytoheavy` VALUES ('5', '3', 'E', '21', '51');
INSERT INTO `groupbytoheavy` VALUES ('6', '3', 'F', '32', '68');
-- 创建表和数据end
查询SQL
--主要是2次,一次获取排名,一次排重,排重算法取最大或者最小id都可以
SELECT
t.*
FROM
groupbytoheavy t,
(
SELECT
MAX(t1.id) AS id,
t1.category
FROM
groupbytoheavy t1,
(
SELECT
MAX(download) AS download,
category
FROM
groupbytoheavy
GROUP BY
category
) t2
WHERE
t1.category = t2.category
AND t1.download = t2.download
GROUP BY
t1.category
) tt
WHERE
t.id = tt.id
结果
id category name click download
---------------- ------ ------- -----------
2 1 B 12 108
4 2 D 22 108
6 3 F 32 68
错误情景
SELECT
id,category,name,click,
MAX(download) AS download
FROM
groupbytoheavy
GROUP BY
category
-- 没有遵循SQL标准,数据出现差行
id category name click download
---------------- ------ ------- -----------
1 1 A 11 108
3 2 C 33 108 --数据完全错误
5 3 E 21 68 --数据完全错误
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 bin07280@qq.com
文章标题:SQL:一个分组取最大值并且去重
文章字数:529
本文作者:Bin
发布时间:2016-03-08, 23:08:46
最后更新:2019-08-06, 00:57:23
原始链接:http://coolview.github.io/2016/03/08/MySQL/SQL-%E4%B8%80%E4%B8%AA%E5%88%86%E7%BB%84%E5%8F%96%E6%9C%80%E5%A4%A7%E5%80%BC%E5%B9%B6%E4%B8%94%E5%8E%BB%E9%87%8D/版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。