mysql 根据行创建日期获取原始RANK()值

ebdffaop  于 2023-02-21  发布在  Mysql
关注(0)|答案(2)|浏览(128)

使用MariaDB并尝试查看是否可以根据创建日期获取表中每一行的原始排名。
例如,想象一个分数表,对于不同的用户和类别具有不同的分数(在本例中分数越低越好)
| 身份证|排行榜ID|用户ID|刻痕|提交时间↓|提交时排名|
| - ------|- ------|- ------|- ------|- ------|- ------|
| 九|十五|五百五十五|五十点五|2022年1月20日01时00分|第二章|
| 八个|十五|九九九|58岁|2022年1月19日01时00分|三个|
| 七|十五|九九九|五十九点一|2022年1月15日01时00分|三个|
| 六个|十五|一百二十三|四十九岁|2022年1月12日01时00分|1个|
| 五个|十五|二百二十二|51.0分|2022年1月10日01时00分|1个|
| 四个|十四|二百二十二|八十七岁|2022年1月9日01时00分|1个|
| 五个|十五|五百五十五|51.0分|2022年1月4日01时00分|1个|
"rankAtSubmit"列是我在这里尝试生成的列(如果可能)。

    • 我想获得每个用户+排行榜的最高/最低分数,并确定该分数在提交时的排名。**

我的尝试失败了,因为在MySQL中,您不能在子查询中引用深度超过1级的外部级列,从而导致在以下查询中尝试引用t.submittedAt时出错:

SELECT *, (
        SELECT ranking FROM (
            SELECT id, RANK() OVER (PARTITION BY leaderboardId ORDER BY score ASC) ranking
            FROM scores x
            WHERE x.submittedAt <= t.submittedAt
            GROUP BY userId, leaderboardId
        ) ranks
        WHERE ranks.id = t.id
    ) rankAtSubmit
FROM scores t
but5z9lq

but5z9lq1#

我没有使用RANK(),而是使用一个子查询来实现这一点,该子查询计算分数低于给定分数并在给定分数之前提交的用户的数量。

SELECT id, userId, score, leaderboardId, submittedAt,
  (
    SELECT COUNT(DISTINCT userId) + 1
    FROM scores t2
    WHERE t2.userId = t.userId AND
          t2.leaderboardId = t.leaderboardId AND
          t2.score < t.score AND
          t2.submittedAt <= t.submittedAt
  ) AS rankAtSubmit
FROM scores t
ktecyv1j

ktecyv1j2#

我从你的问题中理解到你想知道每个用户的最小和最大等级。

SELECT  userId, leaderboardId, score, min(rankAtSubmit),max(rankAtSubmit)
FROM scores 
group BY userId,
     leaderboardId,
     scorescode here

相关问题