这个问题看起来像学校的工作,但事实并非如此。充其量只是自我强加的学校工作。如果他们愿意,我鼓励任何老师都以此为例。
“首先过去”选举是单轮选举,这意味着获得最多选票的人获胜,没有第二轮选举。
假设一个选举表。
CREATE TABLE ElectionResults (
DistrictHnd INTEGER NOT NULL,
PartyHnd INTEGER NOT NULL,
CandidateName VARCHAR2(100) NOT NULL,
TotalVotes INTEGER NOT NULL,
PRIMARY KEY DistrictHnd, PartyHnd);
该表有两个外键:DistrictHnd指向一个区表(列出所有不同的选区),PartyHnd指向一个Party表(列出所有不同的政党)。我不会在这里打扰其他表格,加入它们是微不足道的。这只是一点点背景。
问题:什么SQL查询将返回一个表格,列出每个区域中获胜者的PartyHnd,PartyHnd,CandidateName和TotalVotes(最大投票数)?
这并不假设任何特定的数据库系统。如果您希望坚持SQL的特定实现,那么请采用SQLite和MySQL的方式。如果您可以设计更好的架构(或更简单的架构),那也是可以接受的。标准:简单,可移植到其他数据库。
答案 0 :(得分:3)
Select DistrictHnd, PartyHnd, CandidateName, TotalVotes
From ElectionResults As ER
Where TotalVotes = (
Select Max(ER1.TotalVotes)
From ElectionResults As ER1
Where ER1.DistrictHnd = ER.DistrictHnd
)
在这个查询中,如果存在平局(同一区内两个人的总票数相同),他们都会显示。
答案 1 :(得分:1)
使用SQL Server 2005或更高版本中的窗口函数执行此操作:
;WITH Results_CTE AS
(
SELECT
DistrictHnd, PartyHnd, CandidateName, TotalVotes,
ROW_NUMBER() OVER
(
PARTITION BY DistrictHnd
ORDER BY TotalVotes DESC
) AS RowNum
FROM ElectionResults
)
SELECT DistrictHnd, PartyHnd, CandidateName, TotalVotes
FROM Results_CTE
WHERE RowNum = 1
可能比相关子查询更快,只需要排序和扫描。
注意:对于tie,这只会获得第一个可以任意选择的条目。如果您想在关联的情况下检索所有行(这可能在这里有意义),请将ROW_NUMBER()
更改为RANK()
。