“第一次过选后”查询问题

时间:2010-03-19 00:44:57

标签: sql correlated-subquery

这个问题看起来像学校的工作,但事实并非如此。充其量只是自我强加的学校工作。如果他们愿意,我鼓励任何老师都以此为例。

“首先过去”选举是单轮选举,这意味着获得最多选票的人获胜,没有第二轮选举。

假设一个选举表。

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的方式。如果您可以设计更好的架构(或更简单的架构),那也是可以接受的。标准:简单,可移植到其他数据库。

2 个答案:

答案 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()