[英]SQL MAX function in non-numeric columns
据我了解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?
全表
应用于文本列时,函数MAX
, MIN
等使用词典顺序。 因此,您的MAX(类型)将返回“打印机”而不是“PC”,因为“打印机”按字母顺序位于(大于)“PC”之后。
请注意,在第一个查询中,条件HAVING COUNT(distinct type) = 1
意味着每个组只能有一个type
值。 使用select中的MAX(type)
子句是因为type
不能在select中使用,因为它不在GROUP BY
子句中。
在字符列中,MAX在整理顺序中找到最高值。 在PC和笔记本电脑的情况下:“P”符号在“L”符号后面,因此MAX结果为PC。 打印机和PC:首字母相等但“r”符号在“C”之后,因此MAX结果为打印机。
字符串上使用的MAX()
按字母顺序和长度评估值, a
> b
,但ab
> a
。
在你的情况下, HAVING
子句限制了给定maker
所有记录的type
值相同的位置,因此MAX()
和GROUP BY
仅用于返回单个行,并且type
值无关紧要它返回,因为它们对于可以返回的所有行都是相同的。
如果您更改了第二个查询,它可能会帮助您了解这一切是如何运作的:
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
演示: SQL小提琴
第一个查询也可以重写为:
SELECT maker
, MIN(type)
FROM product
GROUP BY maker
HAVING MAX(type) = MIN(type)
AND COUNT(model) > 1
ORDER BY maker
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.