Нахождение максимального количества голосов на человека в штате - PullRequest
2 голосов
/ 24 апреля 2011

У меня есть таблица с именем голосования

vid     stateid     voterid     voteeid
 1         1           1           1
 2         1           2           1
 3         1           3           1
 4         1           4           1
 5         1           5           2
 6         1           6           2
 7         2           7           3
 8         2           8           3
 9         2           9           4

Я хочу найти максимальное количество голосов, приходящихся на человека в каждом штате.

Select Top 1 voteeid from votes where stateid = 1 group by voteeid order by count(voteeid) desc

Этот запрос может найти максимальное числоголосов за человека в одном штате.

Я хочу найти максимальное количество голосов за человека в каждом штате.Короче говоря, я хочу вывод, подобный этому

votes     voteeid
 4            1
 2            3

Может ли кто-нибудь направить меня в правильном направлении?

Спасибо

1 Ответ

2 голосов
/ 24 апреля 2011

Вы можете group by узнать количество голосов в каждом штате и использовать rank, чтобы выбрать всех лучших участников голосования:

select  stateid
,       voteeid
,       votes
from    (
        select  stateid
        ,       voteeid
        ,       count(*) as votes
        ,       rank() over (partition by stateid order by count(*) desc) 
                    as rn
        from    @votes
        group by
                stateid
        ,       voteeid
        ) cnt
where   rn = 1

Используйте row_number вместо rank, если не хотите галстуков.

Для MySQL вы не можете использовать функции ранжирования, поэтому вам нужно добавить дополнительный запрос, чтобы найти максимальное количество голосов в каждом штате:

select  cnt.stateid
,       cnt.voteeid
,       cnt.votes
from    (
        select  stateid
        ,       voteeid
        ,       count(*) as votes
        from    @votes
        group by
                stateid
        ,       voteeid
        ) cnt
join    (
        select  stateid
        ,       max(votes) as maxvotes
        from    (
                select  stateid
                ,       voteeid
                ,       count(*) as votes
                from    @votes
                group by
                        stateid
                ,       voteeid
                ) cnt2
        group by
                stateid
        ) filter_max
on      filter_max.stateid = cnt.stateid
        and filter_max.maxvotes = cnt.votes

Пример данных SO

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...