【问题标题】:MySQL Conditional count based on a value in another columnMySQL 条件计数基于另一列中的值
【发布时间】:2015-08-19 01:06:36
【问题描述】:

我的表格如下所示:

id rank
a  2
a  1
b  4
b  3
c  7
d  1
d  1
e  9

我需要在一个列上获取所有不同的排名值,并计算所有已达到与第一列相同或更高排名的唯一 ID。

所以我需要的结果是这样的:

rank count
1    5
2    4
3    3
4    3
7    2
9    1

我已经能够制作一个包含所有唯一 ID 及其最大排名的表格:

SELECT 
MAX(rank) AS 'TopRank',
id
FROM myTable
GROUP BY id

我还能够获取所有不同的排名值并计算有多少 id 达到了该排名:

SELECT
DISTINCT TopRank AS 'rank',
COUNT(id) AS 'count of id'
FROM
  (SELECT 
  MAX(rank) AS 'TopRank',
  id
  FROM myTable
  GROUP BY id) tableDerp
GROUP BY TopRank
ORDER BY TopRank ASC

但我不知道如何计算排名等于或高于第 1 列中排名的 id。尝试 SUM(CASE WHEN TopRank > TopRank THEN 1 END) 自然不会给我任何结果。那么如何获得 TopRank 高于或等于每个不同排名值的 id 计数?还是我看错了,应该尝试运行总计之类的方法?我试图寻找类似的问题,但我认为我在这里完全走错了路,因为我找不到任何问题,这似乎是一个非常简单的问题,我只是以某种方式过度思考。非常感谢任何帮助。

【问题讨论】:

  • 对不起,你能再解释一下为什么排名 1 = 5,而不是 3??
  • 嗨草莓。因为有 5 个不同的 id 的等级为 1 或更高(a、b、c、d 和 e)。

标签: mysql count distinct conditional-statements


【解决方案1】:

一种方法是使用相关子查询。只需获取排名列表,然后使用相关子查询来获取您要查找的计数:

SELECT r.rank,
       (SELECT COUNT(DISTINCT t2.id)
        FROM myTable t2
        WHERE t2.rank >= r.rank
       ) as cnt
FROM (SELECT DISTINCT rank FROM myTable) r;

【讨论】:

  • 嗨,戈登。谢谢,这似乎解决了我的问题!
猜你喜欢
  • 1970-01-01
  • 2021-07-17
  • 1970-01-01
  • 1970-01-01
  • 2013-05-04
  • 2020-11-17
  • 2016-03-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多