SQL:一个分组取最大值并且去重

  1. 要求
  2. 创建表和数据
  3. 查询SQL
  4. 结果
  5. 错误情景

处理分组获取最大值后去重的问题。

要求

有一张表,字段和内容如下,

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" 转载请保留原文链接及作者。

目录