【问题标题】:MYSQL RANK OVER and get the latest rankMYSQL RANK OVER 获取最新排名
【发布时间】:2019-11-16 09:15:48
【问题描述】:
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 排名最高的记录,我也想要排名。有没有办法不将上述查询放入子查询并选择 MAX(rank)

【问题讨论】:

  • 每个窗口的最高排名不都是1吗?无论如何,您很可能必须使用 CTE 或子查询。请参阅此帖子了解原因:stackoverflow.com/questions/13997177/…
  • 请提供示例数据和相应的输出。

标签: mysql sql mariadb


【解决方案1】:

在 MySQL 中似乎需要子查询。不过,使用它可能更有效:

SELECT t.*
FROM tab
ORDER BY row_id = (SELECT MAX(t2.row_id) FROM tab t2 WHERE t2.p_id = t.p_id);

【讨论】:

  • 这给了我所有等级的所有记录。我只需要最高等级和获得等级的记录。
  • @VinodNadar - “获得的排名”是什么意思?
  • 我的意思是我不仅想要排名最高的记录,我可以通过在 desc 中简单地对记录进行排序,我还想要它得到的排名
  • @VinodNadar 。 . .这(和您的查询)为每个 pid 返回单独的行。
【解决方案2】:

测试数据:

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);

查询:

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

输出:

+--------+------+------+--------+
| row_id | p_id | rank | rownum |
+--------+------+------+--------+
|      3 |    1 |    3 |      1 |
|      2 |    2 |    2 |      1 |
|      4 |    3 |    4 |      1 |
+--------+------+------+--------+

【讨论】:

    【解决方案3】:

    看来我无论如何都需要使用子查询,所以我最终如下

    样本数据

        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
    

    查询

    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;
    

    输出

    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
    

    【讨论】:

      猜你喜欢
      • 2016-05-14
      • 2023-04-04
      • 1970-01-01
      • 2022-12-08
      • 2021-12-06
      • 1970-01-01
      • 1970-01-01
      • 2010-11-20
      • 1970-01-01
      相关资源
      最近更新 更多