2010-03-19 2 views
0

Эта проблема может показаться школьной работой, но это не так. В лучшем случае это самостоятельная школьная работа. Я рекомендую, чтобы учителя учились в качестве примера, если они того пожелают.Задача запроса «первое после выборов»

«Первое после поста» выборы однократные, что означает, что тот, кто получает наибольшее количество голосов, не имеет вторых раундов.

Предположим, что таблица для выборов.

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-запрос вернет таблицу, в которой перечислены районы районаHnd, PartyHnd, CandidateName и TotalVotes победителей (максимальное количество голосов) в каждом округе?

Это не предполагает никакой конкретной системы баз данных. Если вы хотите придерживаться определенной реализации SQL, перейдите по пути SQLite и MySQL. Если вы можете разработать лучшую схему (или более легкую), это тоже приемлемо. Критерии: простота, переносимость в другие базы данных.

+0

Hnd? Что случилось с идентификатором? –

+0

Сила привычки. Как правило, я использую ID для любой формы распознаваемого целого числа, а Hnd для чего-то более внутреннего, что, вероятно, будет автоинкремент. – MPelletier

ответ

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 
        ) 

В этом запросе, если есть связь (два человека, в том же районе с тем же числом общего количества голосов), они оба шоу.

+0

О, хватит, это просто слишком штопать! Как вы называете этот тип запроса еще раз? – MPelletier

+1

Он называется коррелированным подзапросом, где что-то во внутреннем запросе ссылается на столбец во внешнем запросе. – Thomas

+0

Спасибо. Только то, что я искал. – MPelletier

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 

Возможно быстрее, чем коррелированные подзапросы, нужно только сортировка и сканирование.

Примечание: в случае связей это приведет только к первой записи, которая будет произвольно выбрана. Если вы хотите получить все строки в случае связей (что, вероятно, имеет смысл здесь), измените ROW_NUMBER() на RANK().

Смежные вопросы