Sql ";“选举后第一次当选”;查询问题
这个问题看起来像是学校的作业,但事实并非如此。充其量只是自我强加的学校作业。我鼓励任何教师,如果愿意的话,以is为例 “事后第一轮”选举是单轮选举,这意味着无论谁获得最多选票,都不会有第二轮选举 假设有一张选举桌Sql ";“选举后第一次当选”;查询问题,sql,correlated-subquery,Sql,Correlated Subquery,这个问题看起来像是学校的作业,但事实并非如此。充其量只是自我强加的学校作业。我鼓励任何教师,如果愿意的话,以is为例 “事后第一轮”选举是单轮选举,这意味着无论谁获得最多选票,都不会有第二轮选举 假设有一张选举桌 CREATE TABLE ElectionResults ( DistrictHnd INTEGER NOT NULL, PartyHnd INTEGER NOT NULL, CandidateName VARCHAR2(100) NOT NULL, T
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指向District表(列出所有不同的选区),PartyHnd指向Party表(列出所有不同的政党)。我不想在这里为其他桌子操心,加入它们是微不足道的。这只是一点点的背景
问题是:什么样的SQL查询将返回一个表,列出每个地区的地区HND、PartyHnd、候选名称和得票总数(最大票数)?
这并不假设任何特定的数据库系统。如果您希望坚持使用特定的SQL实现,请选择SQLite和MySQL。如果你能设计出一个更好的模式(或者更简单的模式),这也是可以接受的。标准:简单,可移植到其他数据库
Select DistrictHnd, PartyHnd, CandidateName, TotalVotes
From ElectionResults As ER
Where TotalVotes = (
Select Max(ER1.TotalVotes)
From ElectionResults As ER1
Where ER1.DistrictHnd = ER.DistrictHnd
)
在这个查询中,如果有一个平局(两个人在同一地区拥有相同的总票数),他们都会显示出来
在此查询中,如果出现平局(同一地区的两个人拥有相同的总票数),他们将同时显示。要使用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
可能比相关子查询更快,只需要排序和扫描
注意:在领带的情况下,这只会让你得到第一个条目,它将被任意选择。如果要在出现结的情况下检索所有行(这在这里可能有意义),请使用SQL Server 2005或更高版本中的窗口功能将
ROW_NUMBER()
更改为RANK()
:
;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\u NUMBER()
更改为RANK()
哦,太糟糕了!这种类型的查询又叫什么?它被称为关联子查询,其中内部查询中的某些内容引用了外部查询中的一列。谢谢。这正是我要找的。哦,太糟糕了!这种类型的查询又叫什么?它被称为关联子查询,其中内部查询中的某些内容引用了外部查询中的一列。谢谢。这正是我想要的。习惯的力量。作为一般规则,我使用ID表示任何形式的可识别整数,Hnd表示任何可能是自动递增的内部变量。习惯的力量。作为一般规则,我使用ID表示任何形式的可识别整数,Hnd表示任何可能是自动递增的内部变量。