首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MYSQL排名超过并获得最新排名

MYSQL排名超过并获得最新排名
EN

Stack Overflow用户
提问于 2019-07-06 03:02:49
回答 3查看 82关注 0票数 0
代码语言:javascript
复制
SELECT row_id, p_id, dt, 
     RANK() OVER (PARTITION BY p_id ORDER BY row_id ASC) AS rank
FROM tab
ORDER BY p_id, row_id ASC;

我只想与每个p_id的最高排名的记录,我也想排名。有没有一种方法可以做到这一点,而不是将上面的查询放入子查询中并选择最大(排名)

EN

回答 3

Stack Overflow用户

发布于 2019-07-06 03:04:47

在MySQL中,子查询似乎是必需的。不过,使用下面的代码可能更有效:

代码语言:javascript
复制
SELECT t.*
FROM tab
ORDER BY row_id = (SELECT MAX(t2.row_id) FROM tab t2 WHERE t2.p_id = t.p_id);
票数 2
EN

Stack Overflow用户

发布于 2019-07-06 05:43:52

测试数据:

代码语言:javascript
复制
CREATE TABLE tab ( p_id INT, row_id INT );

INSERT INTO tab VALUES
    (1, 1), (1, 2), (1, 3),
    (2, 1), (2, 2),
    (3, 1), (3, 2), (3, 3), (3, 4);

查询:

代码语言:javascript
复制
WITH cte AS (
 SELECT row_id, p_id,
  RANK() OVER (PARTITION BY p_id ORDER BY row_id ASC) AS `rank`,
  ROW_NUMBER() OVER (PARTITION BY p_id ORDER BY row_id DESC) AS `rownum`
 FROM tab
)
SELECT * FROM cte WHERE rownum = 1

输出:

代码语言:javascript
复制
+--------+------+------+--------+
| row_id | p_id | rank | rownum |
+--------+------+------+--------+
|      3 |    1 |    3 |      1 |
|      2 |    2 |    2 |      1 |
|      4 |    3 |    4 |      1 |
+--------+------+------+--------+
票数 1
EN

Stack Overflow用户

发布于 2019-07-06 14:35:26

看起来我无论如何都需要使用子查询,所以我的结果如下所示

样本数据

代码语言:javascript
复制
    row_id  p_id    dt
    1       1       2018-07-01
    2       3       2019-06-01
    3       2       2017-05-13
    4       1       2018-09-05
    5       2       2017-09-25
    6       3       2019-06-02
    7       2       2019-01-01
    8       1       2019-01-06
    9       1       2019-05-03

查询

代码语言:javascript
复制
WITH cte AS (
    SELECT row_id, p_id, dt,
        RANK() OVER (PARTITION BY p_id ORDER BY row_id ASC) rank1,
        RANK() OVER (PARTITION BY p_id ORDER BY row_id DESC) rank2
    FROM tab
)
SELECT * FROM cte WHERE rank2 = 1;

输出

代码语言:javascript
复制
row_id   p_id  dt,          rank1   rank2
6        3     2019-06-02   2       1
7        2     2019-01-01   3       1
9        1     2019-05-03   4       1
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56908106

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档