Sql 如何找到val1的最大值,其中val2是最大值?

Sql 如何找到val1的最大值,其中val2是最大值?,sql,sybase,Sql,Sybase,Sybase数据库管理系统 在我的玩家表中,我有4列: 玩家 得分 邮政署 加上 如果我想找到玩家的分数,其中post_dt是最大值,add_dt是post_dt和该玩家的最大值,我该怎么做?我下面的查询需要很长时间才能运行,可能效率不高 select player, score from tb t1 where post_dt in (select max(add_dt) from tb t2 where t1.player = t2.playe

Sybase数据库管理系统

在我的玩家表中,我有4列:

  • 玩家
  • 得分
  • 邮政署
  • 加上
  • 如果我想找到玩家的分数,其中post_dt是最大值,add_dt是post_dt和该玩家的最大值,我该怎么做?我下面的查询需要很长时间才能运行,可能效率不高

    select player, score from tb t1 
    where post_dt in 
          (select max(add_dt) 
           from tb t2 
           where t1.player = t2.player and t2.post_dt in 
                 (select max(post_dt) 
                  from tb t2 
                  where t1.player = t2.player))
    
    桌子

    查询的预期结果:

    01, 26, 2017-02-01, 2017-01-17
    02, 27, 2017-03-25, 2017-03-05
    03,  4, 2017-01-03, 2016-12-25
    

    可以通过使用相关子查询来实现这一点

    SELECT t1.player,
           t1.score
           FROM tb t1
           WHERE t1.post_dt = (SELECT max(t2.post_dt)
                                      FROM tb t2
                                      WHERE t2.player = t1.player)
                 AND t1.add_dt = (SELECT max(t2.add_dt)
                                         FROM tb t2
                                         WHERE t2.player = t1.player
                                               AND t2.post_dt = t1.post_dt);
    
    或者,如果DBMS支持窗口函数,请使用
    rank()
    window函数

    SELECT x.player,
           x.score
           FROM (SELECT t.player,
                        t.score,
                        rank() OVER (PARTITION BY t.player
                                     ORDER BY t.post_dt DESC,
                                              t.add_dt DESC) r
                        FROM tb t) x
           WHERE x.r = 1;
    
    还有一种选择是内部连接子查询,它分别通过
    player
    player
    post\dt
    构建最大值

    SELECT t1.player,
           t1.score
           FROM tb t1
                INNER JOIN (SELECT t2.player,
                                   max(t2.post_dt) post_dt
                                   FROM tb t2
                                   GROUP BY t2.player) t3
                           ON t3.player = t1.player
                              AND t3.post_dt = t1.post_dt
                INNER JOIN (SELECT t3.player,
                                   t3.post_dt,
                                   max(t3.add_dt) add_dt
                                   FROM tb t3
                                   GROUP BY t3.player,
                                            t3.post_dt) t4
                           ON t4.player = t1.player
                              AND t4.post_dt = t1.post_dt
                              AND t4.add_dt = t1.add_dt;
    

    你的数据库管理系统是什么?你能详细说明一下吗,最好是用一些示例数据。很难理解您的需求。哪种Sybase RDBMS产品(ASE?SQLAnywhere?IQ?Advantage?)和版本?除了Cetin的评论,请阅读,然后回来更新你的问题。我用样本数据更新了我的帖子。这太棒了!非常感谢。我用了你的第二个解决方案。
    SELECT t1.player,
           t1.score
           FROM tb t1
                INNER JOIN (SELECT t2.player,
                                   max(t2.post_dt) post_dt
                                   FROM tb t2
                                   GROUP BY t2.player) t3
                           ON t3.player = t1.player
                              AND t3.post_dt = t1.post_dt
                INNER JOIN (SELECT t3.player,
                                   t3.post_dt,
                                   max(t3.add_dt) add_dt
                                   FROM tb t3
                                   GROUP BY t3.player,
                                            t3.post_dt) t4
                           ON t4.player = t1.player
                              AND t4.post_dt = t1.post_dt
                              AND t4.add_dt = t1.add_dt;