从每个位置的数据库中获取获胜者 - 投票系统

Getting winners from database per position - Voting system

所以我的数据在 table 中是这种格式

Candidate Name      Position ID       Total Votes
_____________     _____________     _____________
Name 1                   1                 1
Name 2                   1                 3
Name 3                   2                 1
Name 4                   2                 4
Name 5                   3                 1
Name 6                   3                 5

如何获得每个位置的每个获胜者。我尝试了很多查询,但没有得到正确的结果。任何帮助将不胜感激。

让你的 table 由 t 表示。请注意,此查询确实为所有获胜者提供了最大票数。

with position_max(position, max_vote) as
(
    select position, max(votes)
    from t
    group by position
)
select t.name, t.position
from t, position_max
where t.position=position_max.position and t.votes=position_max.max_vote;

没有 with 子句:

select t.name, t.position
from t
join (
    select position, max(votes) as votes
    from t
    group by position
) ta on ta.position=t.position
where t.votes=ta.votes;

这是一个可能的解决方案,可能有点天真,但我似乎想不出更好的版本。

让我们考虑一个 table 的细节如下:

CREATE TABLE VOTING (Name TEXT, position integer, votes integer);
INSERT INTO VOTING VALUES("Name 1", 1, 1);
INSERT INTO VOTING VALUES("Name 2", 1, 3);
INSERT INTO VOTING VALUES("Name 3", 2, 1);
INSERT INTO VOTING VALUES("Name 4", 2, 4);
INSERT INTO VOTING VALUES("Name 5", 3, 1);
INSERT INTO VOTING VALUES("Name 6", 3, 5);

查询是:

SELECT name, 
       A.position, 
       votes 
FROM   voting A, 
       (SELECT position, 
               Max(votes) AS M 
        FROM   voting 
        WHERE  position IN (SELECT DISTINCT( position ) 
                            FROM   voting) 
        GROUP  BY position) B 
WHERE  A.position = B.position 
       AND A.votes = B.m; 

我的思考过程如下:

  • 首先 select 所有可能的不同 position 值。
  • 对于每个不同的 position 检索该位置的 max(votes)
  • max(votes) 列附加到原始 table 中,其中 position 值匹配,这意味着对于每一行和位置对,该位置都有一个最大(投票数)可用.
  • 过滤这个新的 table,其中位置匹配且原始投票值与最大(投票)值匹配,并且您有 table。您可以根据需要进一步订购 (ASC/DESC)

结果如下:

Name    position    votes
------  --------    -----
Name 2  1           3
Name 4  2           4
Name 6  3           5

这是 link 到 运行 的示例:http://sqlfiddle.com/#!9/8d7ce6/54/0