zoukankan      html  css  js  c++  java
  • [mysql] 先按某字段分组再取每组中前N条记录

    From: http://blog.chinaunix.net/uid-26729093-id-4294287.html

    请参考:http://bbs.csdn.net/topics/330021260

    create table t2 (
        id int primary key,
        gid    char,
        col1    int,
        col2    int
    ) engine=myisam;

    insert into t2 values 
    (1,'A',31,6),
    (2,'B',25,83),
    (3,'C',76,21),
    (4,'D',63,56),
    (5,'E',3,17),
    (6,'A',29,97),
    (7,'B',88,63),
    (8,'C',16,22),
    (9,'D',25,43),
    (10,'E',45,28),
    (11,'A',2,78),
    (12,'B',30,79),
    (13,'C',96,73),
    (14,'D',37,40),
    (15,'E',14,86),
    (16,'A',32,67),
    (17,'B',84,38),
    (18,'C',27,9),
    (19,'D',31,21),
    (20,'E',80,63),
    (21,'A',89,9),
    (22,'B',15,22),
    (23,'C',46,84),
    (24,'D',54,79),
    (25,'E',85,64),
    (26,'A',87,13),
    (27,'B',40,45),
    (28,'C',34,90),
    (29,'D',63,8),
    (30,'E',66,40),
    (31,'A',83,49),
    (32,'B',4,90),
    (33,'C',81,7),
    (34,'D',11,12),
    (35,'E',85,10),
    (36,'A',39,75),
    (37,'B',22,39),
    (38,'C',76,67),
    (39,'D',20,11),
    (40,'E',81,36);


    期望结果
    1) N=1 取GID每组 COL2最大的记录
        +----+------+------+------+
        | id | gid  | col1 | col2 |
        +----+------+------+------+
        |  6 | A    |   29 |   97 |
        | 15 | E    |   14 |   86 |
        | 24 | D    |   54 |   79 |
        | 28 | C    |   34 |   90 |
        | 32 | B    |    4 |   90 |
        +----+------+------+------+
    2) N=3 取GID每组 COL2最大的3条记录
        +----+------+------+------+
        | id | gid  | col1 | col2 |
        +----+------+------+------+
        |  6 | A    |   29 |   97 |
        | 11 | A    |    2 |   78 |
        | 36 | A    |   39 |   75 |
        | 32 | B    |    4 |   90 |
        |  2 | B    |   25 |   83 |
        | 12 | B    |   30 |   79 |
        | 28 | C    |   34 |   90 |
        | 23 | C    |   46 |   84 |
        | 13 | C    |   96 |   73 |
        | 24 | D    |   54 |   79 |
        |  4 | D    |   63 |   56 |
        |  9 | D    |   25 |   43 |
        | 15 | E    |   14 |   86 |
        | 25 | E    |   85 |   64 |
        | 20 | E    |   80 |   63 |
        +----+------+------+------+


    SELECT a.id,a.gid,a.col1,a.col2 FROM t2 a
    LEFT JOIN t2 b
    ON a.gid=b.gid AND a.col2<=b.col2
    GROUP BY a.id,a.gid,a.col1,a.col2
    HAVING COUNT(b.id)<=3
    ORDER BY a.gid,a.col2 desc


    SELECT a.id,a.gid,a.col1,a.col2 FROM t2 a
    WHERE 3>=(
    SELECT COUNT(*) FROM t2 b
    WHERE a.gid=b.gid AND a.col2<=b.col2)
    ORDER BY a.gid,a.col2 desc

  • 相关阅读:
    559. N叉树的最大深度
    999. 车的可用捕获量
    1051. 高度检查器
    238. 除自身以外数组的乘积
    【Go】Go语言的%d,%p,%v等占位符的使用
    【Java】commons-lang3中DateUtils类方法介绍
    【Java】时间戳与Date相互转换
    【Linux】crontab定时任务用用法
    【Java】使用Lambda排序集合
    【PBFT】拜占庭容错
  • 原文地址:https://www.cnblogs.com/joeblackzqq/p/4334132.html
Copyright © 2011-2022 走看看