Как найти максимальное значение из группы в SQL
Я просто изучаю SQL, поэтому у меня есть вопрос.
-У меня есть таблица с именем TABL
-Переменная :ccname
который имеет значениеBottle
"
Таблица выглядит следующим образом:
+----------+---------+-------+--------+
| Name | Price | QTY | CODE |
+----------+---------+-------+--------+
| Rope | 3.6 | 35 | 236 |
| Chain | 2.8 | 15 | 237 |
| Paper | 1.6 | 45 | 124 |
| Bottle | 4.5 | 41 | 478 |
| Bottle | 1.8 | 12 | 123 |
| Computer | 1450.75 | 71 | 784 |
| Spoon | 0.7 | 10 | 412 |
| Bottle | 1.3 | 15 | 781 |
| Rope | 0.9 | 14 | 965 |
+----------+---------+-------+--------+
Теперь я хочу найти CODE
из переменной :ccname
с большим количеством! Итак, я перевел так:
SELECT CODE
FROM TABL
GROUP BY :ccname
WHERE QTY=MAX(QTY)
В идеальном мире, который превратится в результате 478
, В мире SQL, что я должен написать, чтобы получить 478
?
5 ответов
Попробуй это
SELECT CODE
FROM TABLENAme
WHERE QTY = (SELECT MAX(QTY) FROM TablName WHERE Name = :ccname)
Вы, вероятно, хотите что-то подобное:
SELECT code
FROM TABL
WHERE Name=:ccname
ORDER BY QTY DESC
LIMIT 1
Идея в том, что мы находим все строки таблицы, чьи Name
столбец совпадает с содержимым переменной :ccname
, затем упорядочите их по количеству в порядке убывания, и сначала мы выбираем первый, который должен быть самым большим, поскольку они отсортированы в порядке убывания.
В зависимости от конкретной базы данных вы можете использовать один из следующих параметров, чтобы ограничить ваш набор результатов одним значением после упорядочения существующих столбцов через ORDER BY
пункт:
SELECT TOP 1
LIMIT 1
FETCH FIRST 1 ROW ONLY
Примеры синтаксиса
SELECT TOP 1 Code
FROM TABL
WHERE Name = :ccname
ORDER BY QTY DESC
или же
SELECT Code
FROM TABL
WHERE Name = :ccname
ORDER BY QTY DESC
LIMIT 1
или же
SELECT CODE
FROM TABL
WHERE Name = :ccname
ORDER BY QTY DESC
FETCH FIRST 1 ROW ONLY;
Использование ORDER BY
собственно WHERE
и что-то, чтобы ограничить результирующий набор одной строкой:
SELECT CODE
FROM TABL
WHERE name = :ccname
ORDER BY QTY DESC
FETCH FIRST 1 ROW ONLY;
Примечание. Некоторые базы данных соответствуют стандарту ANSI. FETCH FIRST 1 ROW ONLY
как LIMIT
или как SELECT TOP 1
,
Использование соединения также может эффективно решить вопрос:
Select t1.Code
From TABL As t1 Join (
Select Name, Max(table.QTY) as MaxQTY
From TABL
Where Name = :ccname
Group by Name
) As t2
Where t1.QTY = t2.MaxQTY And t1.Name = t2.Name
Объяснение:
Сначала вы вычисляете максимальное значение "Бутылки", используя подзапрос, а затем соединяете две таблицы, чтобы выбрать соответствующую строку с MaxQTY и тем же именем.