Как получить строку с минимальным значением из подзапроса в SQL? - PullRequest
0 голосов
/ 10 апреля 2020

У меня есть таблица Saledetail со столбцами prodid, Quantity. Я хочу получить prodid с минимальной суммой количества из этой таблицы.

После прохождения через такой ресурс, как: SQL запрос, чтобы выбрать отдельную строку с минимальным значением

Я написал этот запрос

select prodid, sum(quantity) as k
from saledetail
group by prodid

и его вывод:

+--------+----+
| PRODID | K  |
+--------+----+
|    102 | 11 |
|    101 |  5 |
|    104 |  4 |
|    106 |  4 |
|    103 |  2 |
+--------+----+

Теперь, чтобы получить prodid с минимальным значением k, я придется использовать select min(k) from table_name. Но у меня нет table_name для этого запроса, так как это подзапрос. Я также попытался навязать им псевдонимы, затем я получил ошибку и не смог понять.

Я хотел бы знать, как выполнить мое требование?

В случае, если есть какое-либо лучшее решение, которое также приветствуется .

Спасибо

1 Ответ

2 голосов
/ 10 апреля 2020

Oracle

Чтобы получить продукт (ы) с минимальным общим количеством в Oracle, используйте FETCH FIRST ROWS:

select prodid, sum(quantity) as sum_quantity
from saledetail
group by prodid
order by sum(quantity)
fetch first rows with ties;

Альтернативный вариант с использованием исходного запроса:

with sums as 
(
  select prodid, sum(quantity) as sum_quantity 
  from saledetail 
  group by prodid
)
select * 
from sums
where sum_quantity = (select min(sum_quantity) from sums);

MySQL

Этот запрос дает вам один продукт с минимальной суммой количества:

select prodid, sum(quantity) as sum_quantity
from saledetail
group by prodid
order by sum(quantity)
limit 1;

Однако для LIMIT не существует пункта связей , Таким образом, если два или более продуктов имеют одинаковое минимальное общее количество, вышеуказанный запрос выберет один из них произвольно.

Вот простой запрос для получения всех товаров с минимальной суммой количества:

select prodid, sum(quantity) as sum_quantity
from saledetail
group by prodid
having sum(quantity) =
(
  select sum(quantity)
  from saledetail
  group by prodid
  order by sum(quantity)
  limit 1
);

Начиная с MySQL 8, вы можете использовать оконную функцию для чтения таблицы только один раз:

select prodid, sum_quantity
from
(
  select 
    prodid,
    sum(quantity) as sum_quantity,
    min(sum(quantity)) over () as min_sum_quantity
  from saledetail
  group by prodid
) aggregated
where sum_quantity = min_sum_quantity;

Оба Oracle запроса и последний MySQL запрос являются стандартными SQL. MySQL не поддерживает fetch first rows with ties, поэтому первый запрос Oracle не работает в MySQL. Второе с использованием предложения WITH работает с MySQL 8.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...