【问题标题】:MySQL dense_rank not skipping numbersMySQL dense_rank 不跳过数字
【发布时间】:2020-09-23 16:08:13
【问题描述】:

我对 MYSQL 相当陌生,并且无法让密集排名正常工作,我希望有人能够帮助调整我的查询以获得所需的结果。我遇到的问题是在排名相同之后它会转到下一个数字而不是跳过一个数字。我在下面显示了当前结果和预期结果。

        SELECT  gameid,
            score
         , IF(score <> @pscore,@i:=@i+1,@i:=@i) rank
         , @pscore := score          
        FROM playerstats x
        , (SELECT @i:=0,@prev:='',@pscore:='') vars 
        ORDER 
        BY score DESC;

当前结果:

期望的结果:

【问题讨论】:

标签: mysql dense-rank mariadb-10.3


【解决方案1】:

基本上,您需要在对 tdata 进行排序之前对其进行排序。 MySQL

CREATE TABLE playerstats  (
  `Score` INTEGER,
  `Player` VARCHAR(11)
);

INSERT INTO playerstats 
  (`Score`, `Player`)
VALUES
  ('2543', 'jkoffa'),
  ('2204', 'probins'),
  ('2010', 'rwatson'),
  ('2010', 'nbk'),
  ('2010', 'tthamos'),
  ('1950', 'en,acdonald'),
  ('1927', 'dmaginis');
SELECT
`Player`
,IF(@score <> `Score` , @rn := @rn + @cor +1, @rn:= @rn) rnknumber
,IF(@score = `Score` , IF(@cor > 0,@cor := @cor +1,@cor := 1), @cor := 0) correction
,@score := `Score` 'Score'
FROM
(SELECT `Score`, `Player` FROM playerstats ORDER BY Score DESC) t1
, (SELECT @score := -1) t2
,(SELECT @rn := 0) t3,(SELECT @cor := 0) t4
播放器 |号码 |修正 |分数 :------------ | :-------- | ---------: | ----: 杰科法 | 1 | 0 | 2543 探针 | 2 | 0 | 2204 沃森| 3 | 0 | 2010 nbk | 3 | 1 | 2010 塔莫斯 | 3 | 2 | 2010 恩,阿克唐纳| 6 | 0 | 1950 dmaginis | 7 | 0 | 1927年

db小提琴here

对于 Mariadb 10.3

CREATE TABLE playerstats  (
  `Score` INTEGER,
  `Player` VARCHAR(11)
);

INSERT INTO playerstats 
  (`Score`, `Player`)
VALUES
 ('2010', 'tthamos'),
  ('1950', 'acdonald'),
  ('1927', 'dmaginis'),
  ('2010', 'nbk'),
  ('2543', 'jkoffa'),
  ('2204', 'probins'),
  ('2010', 'rwatson');
SELECT
`Player`
,IF(@score <> `Score` , @rn := @rn + @cor +1, @rn:= @rn ) rnknumber
,IF(@score = `Score` , IF(@cor > 0,@cor := @cor +1,@cor := 1), @cor := 0) correction
,@score := `Score` 'Score'
FROM
(SELECT `Score`, `Player` FROM playerstats ORDER BY Score DESC LIMIT 18446744073709551615) t1
, (SELECT @score := -1) t2
,(SELECT @rn := 0) t3,(SELECT @cor := 0) t4
播放器 |号码 |修正 |分数 :------- | :-------- | ---------: | ----: 杰科法 | 1 | 0 | 2543 探针 | 2 | 0 | 2204 塔莫斯 | 3 | 0 | 2010 nbk | 3 | 1 | 2010 沃森| 3 | 2 | 2010 阿克唐纳德| 6 | 0 | 1950 dmaginis | 7 | 0 | 1927年

db小提琴here

【讨论】:

  • nbk - 感谢您的快速回复。它仍然给我和以前一样的结果。排名是 1, 2, 3, 3, 4, 5 而不是 1, 2, 3, 3, 5, 6
  • 所以我更正了您的查询。你的想法是对的,它只需要一点其他逻辑。下次添加数据,作为你想要排名的文本,这样我就不必对你的图片进行 ocr
  • 对不起,我发布了另一个答案,因为在这里放置代码似乎不起作用。
  • nbk 太棒了,再次感谢 - 最后一个问题,如果我们想显示排名数字,如何在 Mariadb 中做到这一点?
  • 对不起,我错过了评论角色。这现在也应该显示排名,如果你只想要三行,你必须写一个只使用三列的 SELECT,然后你还可以切换列的顺序
【解决方案2】:

nbk - 我很抱歉图片将确保下次使用文字。再次感谢您的宝贵时间。不幸的是,它只有在数据以正确的顺序输入时才有效。如果您要取最后三个条目并将它们放在第一位,那么 tthomos 将排名第一。

CREATE TABLE playerstats  (
  `Score` INTEGER,
  `Player` VARCHAR(11)
);

INSERT INTO playerstats 
  (`Score`, `Player`)
VALUES
  ('2010', 'tthamos'),
  ('1950', 'acdonald'),
  ('1927', 'dmaginis'),
  ('2543', 'jkoffa'),
  ('2204', 'probins'),
  ('2010', 'rwatson');

然后跑:

SELECT
`Player`
,IF(@score <> `Score` , @rn := @rn + @cor +1, @rn:= @rn) rnknumber
,IF(@score = `Score` , @cor := 1, @cor := 0) correction
,@score := `Score` 'Score'
FROM
(SELECT `Score`, `Player` FROM playerstats ORDER BY Score DESC) t1
, (SELECT @score := -1) t2
,(SELECT @rn := 0) t3,(SELECT @cor := 0) t4

你会得到:

tthamos   1     0   2010
acdonal   2     0   1950
dmaginis  3     0   1927
jkoffa    4     0   2543
probins   5     0   2204
rwatshon  6     0   2010

【讨论】:

  • 你的答案是错误的,你没有得到你需要的结果,对于我的查询,你使用哪个顺序都没有关系,按分数排序请参阅dbfiddle.uk/…
  • 我使用的是 MySQL MariaDB 10.3,如果我选择它而不是 mysql8,我会得到与我描述的相同的结果。 dbfiddle.uk/… 你认为有可能得到我在 10.3 MariaDB 中寻找的结果,还是我应该考虑迁移到 mysql 8。再次感谢你的时间。
  • 查看我更改后的答案。您也应该从一开始就这样告诉我们,这就是为什么从一开始的 dbfiddle 示例可以让您更快地得到答案
猜你喜欢
  • 2014-05-07
  • 1970-01-01
  • 2016-03-16
  • 1970-01-01
  • 2023-03-03
  • 2012-11-21
  • 1970-01-01
  • 2012-11-27
  • 2020-03-21
相关资源
最近更新 更多