为每个州的人找到最大票数

时间:2011-04-24 14:59:49

标签: sql sql-server-2008

我有一张叫做投票的表

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 个答案:

答案 0 :(得分:2)

您可以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

Example on SO Data