2010-03-19 49 views
0

Ce problème peut sembler être du travail scolaire, mais ce n'est pas le cas. Au mieux, c'est un travail scolaire auto-imposé. J'encourage tous les enseignants à prendre comme exemple s'ils le souhaitent.Le problème de requête «premier après l'élection»

Les élections "au premier tour du scrutin" sont à un tour, ce qui signifie que ceux qui obtiennent le plus de voix gagnent, pas de deuxième tour. Supposons une table pour un choix.

CREATE TABLE ElectionResults (
    DistrictHnd INTEGER NOT NULL, 
    PartyHnd INTEGER NOT NULL, 
    CandidateName VARCHAR2(100) NOT NULL, 
    TotalVotes INTEGER NOT NULL, 
    PRIMARY KEY DistrictHnd, PartyHnd); 

Le tableau a deux clés étrangères: points de DistrictHnd à une table de district (répertorie toutes les différentes Circonscriptions électorales) et des points de PartyHnd à une table Party (répertorie tous les différents partis politiques). Je ne vais pas déranger avec d'autres tables ici, les rejoindre est trivial. C'est juste un petit peu de contexte.

La question: Quelle requête SQL retournera un tableau listant les DistrictHnd, PartyHnd, CandidateName et TotalVotes des gagnants (votes maximum) dans chaque District?

Cela ne suppose aucun système de base de données particulier. Si vous souhaitez vous en tenir à une implémentation particulière de SQL, allez dans SQLite et MySQL. Si vous pouvez concevoir un meilleur schéma (ou un schéma plus simple), cela est également acceptable. Critères: simplicité, portabilité vers d'autres bases de données.

+0

Hnd? Quel est le problème avec ID? –

+0

Force d'habitude. En règle générale, j'utilise ID pour toute forme d'entier reconnaissable, et Hnd pour tout autre élément interne susceptible d'être auto-incrémenté. – MPelletier

Répondre

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 
        ) 

Dans cette requête, s'il y a une égalité (deux personnes dans le même district avec le même nombre de voix au total), ils seront tous deux spectacle.

+0

oh snap, c'est juste trop sacrément bien! Comment appelez-vous ce type de requête à nouveau? – MPelletier

+1

Il s'agit d'une sous-requête corrélée où quelque chose dans la requête interne fait référence à une colonne dans la requête externe. – Thomas

+0

Merci. Exactement ce que je cherchais. – MPelletier

1

Pour ce faire, en utilisant les fonctions de fenêtrage dans SQL Server 2005 ou supérieur:

;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 

probablement plus rapide que qu'une corrélation, n'a besoin que d'une sorte et une analyse.

Note: Dans le cas de liens, cela ne vous donnera que la première entrée qui sera choisie arbitrairement. Si vous souhaitez récupérer toutes les lignes en cas de liens (ce qui est probablement logique ici), remplacez ROW_NUMBER() par RANK().