web-dev-qa-db-ja.com

非数値列のSQL MAX関数

MAX関数を理解している限り、指定された列から最大値を返します。給与列などの数値の場合、それは私にとって明らかです-これは、チュートリアルで見つける唯一のアプリケーションです。ただし、非数値列の場合にどのように機能するかを理解するのに問題があります。

私の問題は、この演習(sql-ex.ru)から生じています。

同じタイプのモデルのみを製造し、それらのモデルの数が1を超えるメーカーを探しますテーブル「製品」には、メーカー、モデル番号、およびタイプに関する情報が含まれます(「PC」、 「ラップトップ」または「プリンタ」)。これに対する解決策の1つは次のとおりです。

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(type)はランダムな値を示すように思えます。なぜメーカーBの結果はラップトップではなくPCなのでしょうか?なぜEではPCではなくプリンターですか?

フルテーブル
http://i.stack.imgur.com/gObvQ.png

20
Bartias

関数MAXMINなどは、テキスト列に適用される場合、辞書式順序を使用します。したがって、MAX(type)は「PC」ではなく「Printer」を返します。これは、「Printer」がアルファベット順で「PC」の後にあるためです。

最初のクエリでHAVING COUNT(distinct type) = 1という条件は、各グループに単一のtypevalueしか存在できないことを意味することに注意してください。 selectではMAX(type)句が使用されます。これは、GROUP BY句にはないため、単にtypeをselectで使用できないためです。

19
trogdor

文字列では、MAXは照合シーケンスの最大値を見つけます。 PCおよびラップトップの場合:「P」記号は「L」記号の後に来るため、MAXの結果はPCです。プリンターとPC:最初の文字は等しいが、「r」記号は「C」の後に来るため、MAXの結果はプリンターです。

3

文字列で使用されるMAX()は、アルファベット順と長さで値を評価します。a> bですが、ab> aです。

あなたの場合、HAVING句は、特定のtypeのすべてのレコードでmaker値が同じ場所に制限されているため、MAX()およびGROUP BYは、単一の行を返すためにのみ使用され、返されるすべての行で同じであるため、typeのどの値が返されるかは関係ありません。

2番目のクエリを変更すると、これがどのように機能するかを確認するのに役立つ場合があります。

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 Fiddle

最初のクエリは次のように書き換えることもできます。

SELECT maker
     , MIN(type)
FROM product
GROUP BY maker
HAVING MAX(type) = MIN(type)
   AND COUNT(model) > 1
ORDER BY maker
1
Hart CO