2015-06-04 4 views
0

У меня есть таблица, которая выглядит следующим образом:MySQL Условный подсчет на основе значения в другом столбце

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

Мне нужно, чтобы получить все различные значения ранга на один столбец и подсчета всех уникальных идентификаторов, которые достигли равный или более высокий ранг, чем в первом столбце.

Так что результат мне нужно будет что-то вроде этого:

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

Я был в состоянии сделать таблицу со всеми уникальными идентификаторами с их максимальным рангом:

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

Я m также может получить все различные значения рангов и подсчитать, сколько идентификаторов достигло именно этого ранга:

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 

B ut Я не знаю, как получить счет id, где ранг равен ИЛИ ВЫШЕ, чем ранг в столбце 1. Попытка SUM (CASE КОГДА TopRank> TopRank THEN 1 END), естественно, ничего мне не дает. Итак, как я могу получить счет id, где TopRank выше или равен каждому отдельному значению рейтинга? Или я искал неправильный путь и должен попробовать что-то вроде текущих итогов? Я попытался найти похожие вопросы, но я думаю, что я полностью ошибаюсь, потому что я не мог найти никого, и это кажется довольно простой проблемой, которую я как бы переусердствовал. Любая помощь очень ценится.

+0

Извините, не могли бы вы объяснить, почему ранг 1 = 5, а не 3 ?? – Strawberry

+0

Привет клубника. Потому что есть 5 отдельных идентификаторов, имеющих ранг 1 или выше (a, b, c, d и e). – miarkito

ответ

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; 
+0

Привет, Гордон. Спасибо, это, похоже, решает мою проблему! – miarkito

Смежные вопросы