SQL Подзапросы и объединения - PullRequest
0 голосов
/ 26 марта 2020

Сумма донорской суммы - это общее количество крови, которое люди готовы сдать. Сумма акцепторной суммы - это общее количество крови, необходимое для этого города. Должно быть ровно две строки, которые обозначают наилучшее и худшее соотношение. Каждая строка должна содержать следующие атрибуты:

  1. Название города (ГОРОД)
  2. Соотношение (сумма донорской суммы / сумма акцепторной суммы)

Is там в любом случае я могу сжать это в один запрос, чтобы вернуть оба значения вместо двух отдельных запросов?

SELECT D.City, D.DA/A.AA AS Ratio
FROM
(SELECT City, SUM(Amount) AS DA FROM Donor
GROUP BY City) AS D
JOIN
(SELECT City, SUM(Amount) AS AA FROM Acceptor
GROUP BY City) AS A
ON D.CITY=A.CITY
ORDER BY Ratio ASC
LIMIT 1

SELECT D.City, D.DA/A.AA AS Ratio
FROM
(SELECT City, SUM(Amount) AS DA FROM Donor
GROUP BY City) AS D
JOIN
(SELECT DISTINCT City, SUM(Amount) AS AA FROM Acceptor
GROUP BY City) AS A
ON D.CITY=A.CITY
ORDER BY Ratio DESC
LIMIT 1

Ответы [ 2 ]

0 голосов
/ 26 марта 2020

Если вы используете MySQL 8.0, вы можете сделать это с помощью row_number(), что избавляет от необходимости сканировать таблицы (или cte) дважды.

select city, ratio
from (
    select 
        d.city, 
        d.da/a.aa ratio, 
        row_number() over(order by d.da/a.aa asc ) rn_asc,
        row_number() over(order by d.da/a.aa desc) rn_desc
    from (select city, sum(amount) as da from donor group by city) d 
    inner join (select city, sum(amount) as aa from acceptor group by city) a 
        on d.city = a.city
) t
where rn_asc = 1 or rn_desc = 1
0 голосов
/ 26 марта 2020

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

Предполагая, что вы используете MySQL 8.x (у вас нет версии), вы можете использовать CTE. Ваш запрос может повторно использовать часть логики c и может принимать форму:

with 
r as (
  select d.city, d.da/a.aa as ratio
  from (
    select city, sum(amount) as da from donor group by city
  ) d join (
    select city, sum(amount) as aa from acceptor group by city
  ) a on d.city = a.city
)
select city, ratio from r order by ratio limit 1
union 
select city, ratio from r order by ratio desc limit 1
...