据我了解MAX函数,它应返回给定列的最大值。对于数值,例如工资列,我很清楚 - 这是我在教程中找到的唯一应用程序。但是,我有一个问题需要了解在非数字列的情况下它是如何工作的。
我的问题源于此练习(在sql-ex.ru上)
找出只生产相同型号型号的制造商,这些型号的数量超过1个。 表“产品”包括有关制造商,型号和类型(“PC”,“笔记本电脑”或“打印机”)的信息。 其中一个解决方案是:
SELECT maker,
MAX(type) AS type
FROM product
GROUP BY maker
HAVING COUNT(DISTINCT type) = 1
AND COUNT(model) > 1
我不明白max的功能 - 它算什么?我尝试了一个更简单的查询来理解它,但它只会让它变得更加困难。
SELECT maker,
MAX(type) AS type, COUNT(type) AS QTY
FROM product
GROUP BY maker
ORDER BY maker
返回的集是
maker type QTY
A Printer 7
B PC 2
C Laptop 1
D Printer 2
E Printer 4
MAX(类型)在我看来显示一个随机值,例如为什么制造商B的结果是PC而不是笔记本电脑?为什么E是打印机而不是PC?
全表
答案 0 :(得分:18)
函数MAX
,MIN
等在应用于文本列时使用词典顺序。因此,您的MAX(类型)将返回“打印机”而不是“PC”,因为“打印机”按字母顺序位于(大于)“PC”之后。
请注意,在您的第一个查询中,条件HAVING COUNT(distinct type) = 1
表示每个组只能有一个type
值。使用select中的MAX(type)
子句是因为只有type
不能在select中使用,因为它不在GROUP BY
子句中。
答案 1 :(得分:3)
在字符列中,MAX在整理顺序中找到最高值。在PC和笔记本电脑的情况下:“P”符号在“L”符号后面,因此MAX结果为PC。打印机和PC:首字母相等但“r”符号在“C”之后,因此MAX结果为打印机。
答案 2 :(得分:1)
MAX()
按字母顺序和长度a
>评估值。 b
,但ab
> a
。
在您的情况下,HAVING
子句限制了给定type
的所有记录的maker
值相同的位置,因此MAX()
和{{1}仅用于返回单个行,并且它返回的GROUP BY
的值无关紧要,因为它们对于可以返回的所有行都是相同的。
如果您更改了第二个查询,它可能会帮助您了解这一切是如何运作的:
type
演示:SQL Fiddle
第一个查询也可以重写为:
SELECT maker
, MAX (type) AS maxType
, MIN (type) AS minType
, COUNT(DISTINCT type) AS QTY
, COUNT(model) AS Models
FROM product
GROUP BY maker
ORDER BY maker