V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
MySQL 5.5 Community Server
MySQL 5.6 Community Server
Percona Configuration Wizard
XtraBackup 搭建主从复制
Great Sites on MySQL
Percona
MySQL Performance Blog
Severalnines
推荐管理工具
Sequel Pro
phpMyAdmin
推荐书目
MySQL Cookbook
MySQL 相关项目
MariaDB
Drizzle
参考文档
http://mysql-python.sourceforge.net/MySQLdb.html
gdtv
V2EX  ›  MySQL

请教 sql 查询怎样先排序再 group by ?

  •  
  •   gdtv · 2017-10-02 23:04:51 +08:00 · 7257 次点击
    这是一个创建于 2611 天前的主题,其中的信息可能已经有所发展或是发生改变。

    要求: 查询出每一组 a 里最大的 b 值

    表结构:

    CREATE TABLE `test` (
      `a` int(11) NOT NULL,
      `b` int(11) NOT NULL
    )
    

    示例数据:

    a    b
    1    1000
    1    2000
    2    1000
    2    2000
    

    期望结果:

    a    b
    1    2000
    2    2000
    

    SQL 语句:

    SELECT T.* FROM (select * from `test` order by b desc) T group by T.a
    

    实际运行结果:

    a    b
    1    1000
    2    1000
    

    请问 SQL 该怎么写才正确?

    第 1 条附言  ·  2017-10-02 23:54:13 +08:00
    感谢 1 楼的回复。

    我的表述不太准确,我不只是要找出最大值,而是要找出最大值所在的那一行。
    1 楼的方法“恰巧”找出了最大值,但不太符合我的要求。

    不讲效率的话,网上大多数解决方法是用子查询 SELECT T.* FROM (select * from `test` order by b desc) T group by T.a,但我这样写却没能获取到期望的结果,搜索了很久终于找到答案:

    http://blog.csdn.net/emaste_r/article/details/73550783
    https://stackoverflow.com/questions/26372511/mysql-order-by-inside-subquery

    所以正确的写法应该是:
    SELECT T.* FROM (select * from `test` order by b desc limit 999999) T group by T.a
    5 条回复    2017-10-03 18:21:44 +08:00
    woshixiaomao
        1
    woshixiaomao  
       2017-10-02 23:11:06 +08:00   ❤️ 2
    SELECT `a`, MAX(`b`) AS `b` FROM `test GROUP BY `a` 这样?
    zjp
        2
    zjp  
       2017-10-02 23:45:53 +08:00 via Android
    你需要的的是最大值,和排序无关。
    一楼少个`😂
    msg7086
        3
    msg7086  
       2017-10-03 08:39:59 +08:00
    GROUP BY 聚合函数在聚合行的时候顺序是不确定的,多次运行的结果都有可能会不同。
    必须要用子查询或者程序逻辑来获取特定的行的结果。
    cye3s
        4
    cye3s  
       2017-10-03 14:21:49 +08:00 via iPad
    Max(b) over (partition by a),不试过分析函数?没有?
    woshixiaomao
        5
    woshixiaomao  
       2017-10-03 18:21:44 +08:00
    @zip 被发现了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5640 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 03:33 · PVG 11:33 · LAX 19:33 · JFK 22:33
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.