【问题标题】:SQL Count and DuplicatesSQL 计数和重复
【发布时间】:2016-10-27 12:18:22
【问题描述】:

假设一个小镇正在举行选举,每个公民都可以根据自己的意愿投票,但投票次数越多,他们的选票就会分裂,而且他们不能重复投票。

Voter   Vote
---------------
Jane    Jane
Howard  Jane
John    Howard
John    Howard
Jane    John
Sara    Howard

您将如何在 SQL 查询中确定获胜者是谁?

我是一个基本用户,所以我得到的只是

SELECT  
    vote, COUNT( vote) 
FROM 
    table1 
GROUP BY
    vote

这不考虑重复或投票的分裂。

帮助?

SQLFiddle

【问题讨论】:

  • SELECT vote,COUNT(distinct voter) FROM table1 group by vote
  • 你如何定义“分裂”?选票是否平均分配?也就是说,如果一个选民投票 n 次,每次投票是否算作 1/n?
  • 你说 - “他们不能重复投票”,但你的例子有重复。
  • 我认为您的示例中需要一些“ORDER BY”逻辑。换句话说,也许是一个日期,或者一个“投票顺序”......这样你就知道每个选民的第一次投票是什么(因此是全权重),而后续投票的权重较小......例如,简投票给Jane 和 John 都.. 但哪一个得到了全重,哪一个得到了一半?

标签: sql


【解决方案1】:

您可以使用动态创建的表

 select vote, count(*) 
 from 
     (select distinct voter, vote 
      from table1) as t
 group by vote 

【讨论】:

    【解决方案2】:
    SELECT V.vote, SUM(W.weight) AS votes
    FROM 
    (
    SELECT  voter, CAST(1 AS FLOAT) / COUNT(vote) AS weight
    FROM table1 
    group by voter
    ) W
    JOIN
    (
    SELECT DISTINCT vote, voter
    FROM table1 
    ) V ON W.voter = V.voter
    GROUP BY V.vote
    

    【讨论】:

      【解决方案3】:

      试试这个:

      select vote, sum(1 / votes) as result from 
      (SELECT voter, count(*) as votes from Table1 group by voter) votecount 
      INNER JOIN Table1 on votecount.voter = Table1.voter
      group by vote
      order by result desc
      

      这以一个选民可以给予 2/3 和 1/3 票的方式处理重复问题

      编辑

      添加订单

      【讨论】:

        【解决方案4】:

        您可以使用不同的投票者和投票组合来删除重复的投票

        SELECT vote,COUNT(distinct voter) FROM table1 group by vote
        

        【讨论】:

          【解决方案5】:

          您可以通过子查询确定每个选民投票的适当权重。

          SELECT t1.vote AS 'Candidate', CAST(SUM(t2.`weight`) AS Decimal(6,2)) as 'Votes' 
          FROM table1 AS t1 RIGHT JOIN (
           SELECT voter, 1.0 / CAST( COUNT(*) as Decimal) as `weight` 
           FROM table1 
           GROUP BY voter 
          ) AS t2 ON t1.voter = t2.voter 
          GROUP BY t1.vote 
          ORDER BY t1.vote;
          

          http://sqlfiddle.com/#!9/9e569/48

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-06-09
            • 2012-06-08
            • 2019-02-11
            • 2021-03-17
            • 1970-01-01
            • 2017-11-13
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多