返回介绍

solution / 2800-2899 / 2820.Election Results / README

发布于 2024-06-17 01:02:59 字数 2577 浏览 0 评论 0 收藏 0

2820. 选举结果

English Version

题目描述

表:Votes

+-------------+---------+ 
| Column Name | Type  | 
+-------------+---------+ 
| voter     | varchar | 
| candidate   | varchar |
+-------------+---------+
(voter, candidate) 是该表的主键(具有唯一值的列)。
该表的每一行都包含选民及其候选人的姓名。

选举在一个城市进行,每个人都可以投票给 一个或多个 候选人,也可以选择 投票。每个人都有 1 票,所以如果他们投票给多个候选人,他们的选票会被平均分配。例如,如果一个人投票给 2 个候选人,这些候选人每人获得 0.5 张选票。

编写一个解决方案来查找获得最多选票并赢得选举的候选人 candidate 。输出 候选人 的姓名,或者如果多个候选人的票数 相等 ,则输出所有候选人的姓名。

返回按 candidate 升序排序 的结果表。

查询结果格式如下所示。

 

示例 1:

输入: 
Votes table:
+----------+-----------+
| voter  | candidate |
+----------+-----------+
| Kathy  | null    |
| Charles  | Ryan    |
| Charles  | Christine |
| Charles  | Kathy   |
| Benjamin | Christine |
| Anthony  | Ryan    |
| Edward   | Ryan    |
| Terry  | null    |
| Evelyn   | Kathy   |
| Arthur   | Christine |
+----------+-----------+
输出:
+-----------+
| candidate | 
+-----------+
| Christine |  
| Ryan    |  
+-----------+
解释:
- Kathy 和 Terry 选择不投票,导致他们的投票被记录为 0。 Charles 将他的选票分配给了三位候选人,相当于每位候选人得到 0.33 票。另一方面,Benjamin, Arthur, Anthony, Edward, 和 Evely 各自把票投给了一位候选人。
- Ryan 和 Christine 总共获得了2.33票,而 Kathy 总共获得了 1.33 票。
由于 Ryan 和 Christine 获得的票数相等,我们将按升序显示他们的名字。

解法

方法一:窗口函数 + 分组统计

我们可以使用窗口函数 count 计算每个投票人投给的候选人的票数,然后再使用分组统计函数 sum 计算每个候选人的总票数,最后使用窗口函数 rank 计算每个候选人的排名,最后筛选出排名第一的候选人即可。

注意,结果集中可能会有多个排名第一的候选人,因此我们需要使用 order by 对候选人进行排序。

# Write your MySQL query statement below
WITH
  T AS (
    SELECT candidate, SUM(vote) AS tot
    FROM
      (
        SELECT
          candidate,
          1 / (COUNT(candidate) OVER (PARTITION BY voter)) AS vote
        FROM Votes
        WHERE candidate IS NOT NULL
      ) AS t
    GROUP BY 1
  ),
  P AS (
    SELECT
      candidate,
      RANK() OVER (ORDER BY tot DESC) AS rk
    FROM T
  )
SELECT candidate
FROM P
WHERE rk = 1
ORDER BY 1;

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文