繁体   English   中英

SQL MAX函数在非数字列中

[英]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?

全表
http://i.stack.imgur.com/gObvQ.png

应用于文本列时,函数MAXMIN等使用词典顺序。 因此,您的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM