列表

详情


2820. 选举结果

表: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 获得的票数相等,我们将按升序显示他们的名字。

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
# Write your MySQL query statement below

mysql 解法, 执行用时: 207 ms, 内存消耗: 0 B, 提交时间: 2023-10-15 17:20:14

select candidate
from 
(
	select candidate,rank() over(order by cnt desc) idx
	from 
	(
		select b.candidate,sum(a.cnt) cnt
		from votes b 
		join 
		(
			select voter,1.0/count(voter) cnt
			from votes 
			group by voter
		) a 
		on(b.voter=a.voter)
		where b.candidate is not null 
		group by b.candidate
	) c 
) d 
where idx=1
order by candidate

上一题