代码之家  ›  专栏  ›  技术社区  ›  MPelletier

“选举后第一次通过”问题

  •  0
  • MPelletier  · 技术社区  · 15 年前

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

    “后一轮”选举是单轮选举,即获得最多选票的人获胜,而不是第二轮。

    假设有一张选举桌。

    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指向一个政党表(列出所有不同的政党)。我不会为这里的其他桌子操心的,加入他们是微不足道的。这只是一点上下文。

    问题是: 哪个SQL查询将返回一个表,列出每个地区的Districthnd、Partyhnd、CandidateName和总得票数(最大得票数)?

    这不假设任何特定的数据库系统。如果您希望坚持使用特定的SQL实现,那么可以使用sqlite和mysql。如果你能设计出更好的模式(或者更简单的模式),那也是可以接受的。标准:简单,可移植到其他数据库。

    2 回复  |  直到 15 年前
        1
  •  3
  •   Thomas    15 年前
    Select DistrictHnd, PartyHnd, CandidateName, TotalVotes
    From ElectionResults As ER
    Where TotalVotes = (
                        Select Max(ER1.TotalVotes)
                        From ElectionResults As ER1
                        Where ER1.DistrictHnd = ER.DistrictHnd
                        )
    

    在这个查询中,如果有一个平局(两个人在同一地区,总票数相同),他们都会显示出来。

        2
  •  1
  •   Aaronaught    15 年前

    要使用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
    

    可能比相关子查询更快,只需要排序和扫描。

    注意:如果是领带,这只会得到你的第一个条目,这将是任意选择。如果要检索所有行(这里可能有意义),请更改 ROW_NUMBER() RANK() .