#sql #count #mariadb #subquery #sql-order-by
#sql #подсчитать #mariadb #подзапрос #sql-order-by
Вопрос:
Добрый день. Я ищу, сколько раз или экземпляров каждая СТОРОНА имела наивысший результат или долю в избирательном округе. Я не совсем уверен, как сделать ПОДСЧЕТ. Моя цель — получить набор результатов, который показывает количество раз или избирательных округов, которые каждая ПАРТИЯ выиграла в РЕГИОНЕ
SELECT CANDIDATE_NAME, REGION, CONSTITUENCY, PARTY, RESULT,
ROUND(100.0 * RESULT / SUM(RESULT) OVER (PARTITION BY CONSTITUENCY), 2) AS `SHARE`
FROM e_parlia_election
ORDER BY CONSTITUENCY, `SHARE`DESC
Я использую mysql Тип сервера: MariaDB Версия сервера: 10.4.16-MariaDB —
mariadb.org версия протокола двоичного распространения: 10
Ответ №1:
Вы хотите подсчитать, сколько раз избирательные округа выигрывала каждая партия. Вы можете использовать оконные функции, подобные этому:
select party, sum(rn = 1) as cnt_consituency_won
from (
select e.*,
rank() over(partition by region, constituency order by result desc) as rn
from e_parlia_election e
) e
group by party
В подзапросе функция window ранжирует каждую строку по убыванию result
по сравнению с другими строками, которые имеют одинаковое region
значение и constituency
. Затем внешний запрос агрегируется по party
и подсчитывает, сколько раз каждая сторона занимала первое место.
Редактировать
Если вы хотите исключить верхние связи, вы можете добавить другой уровень агрегирования:
select party, count(*) as cnt_consituency_won
from (
select e.*, sum(rn = 1) over(partition by region, constituency) cnt_rn1
from (
select e.*,
rank() over(partition by region, constituency order by result desc) as rn
from e_parlia_election e
) e
) e
where cnt_rn1 = 1
group by party
Комментарии:
1. При запуске я получил сообщение об ошибке Неизвестный столбец ‘rn’ в ‘списке полей’. Не могли бы вы объяснить, что такое rn?
2. @Enyo: виноват, я забыл указать псевдоним этого столбца в подзапросе. Исправлено
3. отлично. Это сработало с небольшой проблемой. Когда две партии имеют одинаковые голоса в избирательном округе, этот запрос учитывает обе партии как победителей. Что может быть причиной этого?
4. @Enyo: это то, что
rank()
делает. Если вы хотите разорвать связи, какую логику следует использовать?5. если есть ничья, то ни одна партия в этом избирательном округе не должна учитываться. Я добавил предложение where. « выберите ПАРТИЮ, сумму (rn = 1) в качестве ИЗБИРАТЕЛЬНЫХ ОКРУГОВ, ВЫИГРАННЫХ из (выберите e.*, ранг () выше (разделение по регионам, порядок избирательных округов по результату ниже) как rn из e_parlia_election e ) t, ГДЕ ELEC_YEAR = 2020 И RESULT_CONFIRMED = 1 группа по партийному ПОРЯДКУ ПО ИЗБИРАТЕЛЬНЫМ ОКРУГАМ НИЖЕ « У меня есть стол ДЛЯ ВЕЧЕРИНОК, к которому я хочу ПРИСОЕДИНИТЬСЯ за этим столом. Я попробовал приведенное ниже непосредственно перед предложением WHERE, которое не сработало. «` ВНУТРЕННИЕ участники объединения ПРИ e_parlia_election. УЧАСТНИК = участники. Сокращенное имя «