MIN、MAX、非数値の集計
日付や文字列の集計と、テキストに対するMINの意味を学びます。
「MIN、MAX、非数値の集計」はCoddyKit上の無料Coding Interview Prepレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはCoding Interview Prep学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Coding Interview Prepコースには全4レッスンが含まれています。
数値以外の MIN と MAX
候補者は、MIN と MAX が数値にしか使えないと思いがちです。面接官は次のような質問を好みます: 「MAX(name) は何を返しますか? MIN(order_date) はどうですか?」
実際には、MIN と MAX は数値、日付、文字列など、順序付け可能な任意の型で使えます。ここで本当に試されているのは、それぞれの型における順序付けのルールを理解しているかどうかです。
数値の場合
まずはおなじみの数値から始めます。数値列では、MIN は最小値を、MAX は最大値を返します。単純です。
他の集約関数と同様に、MIN と MAX はNULL を無視します。NULL が最小値や最大値になることはなく、単にスキップされます。すべての値が NULL の場合は、どちらも NULL を返します。
SELECT MIN(salary) AS lowest, MAX(salary) AS highest
FROM employees;日付に対する MIN と MAX
日付とタイムスタンプは完全に順序付けできるため、MIN(order_date) は最も早い日付を、MAX(order_date) は最も遅い日付を返します。
これにより、並べ替えや件数制限を行わずに、「最初の注文が行われたのはいつか」(MIN)や「最新のアクティビティは何か」(MAX)という問いに答えられます。これは慣用的な集合ベースの解決方法です。
SELECT
MIN(order_date) AS first_order,
MAX(order_date) AS latest_order
FROM orders;1回のクエリで日付の範囲を求める
よくある次の質問は、「この顧客はどのくらいの期間アクティブでしたか?」です。MIN と MAX を組み合わせてから、差を求めます。
これにより、最初の注文から最後の注文までの期間を計算できます。差を求める正確な構文はSQL方言によって異なりますが、MIN/MAXを使うという考え方は普遍的であり、範囲を宣言的に表現できることを示しています。
SELECT
customer_id,
MIN(order_date) AS first_order,
MAX(order_date) AS last_order,
MAX(order_date) - MIN(order_date) AS active_days
FROM orders
GROUP BY customer_id;文字列に対する MIN と MAX
ここは意外に思われやすい部分です。テキスト列に対しては、MIN と MAX は列の照合順序に基づく辞書順(アルファベット順)を使用します。
したがって、MIN(name) はアルファベット順で最初に並ぶ名前を、MAX(name) は最後に並ぶ名前を返します。{'Carol', 'Alice', 'Bob'} に対する MIN は'Alice'を返し、MAX は'Carol'を返します。
SELECT MIN(name) AS first_alpha, MAX(name) AS last_alpha
FROM employees;
-- with Alice, Bob, Carol: 'Alice' and 'Carol'照合順序と大文字・小文字の区別
文字列の順序は照合順序に依存します。照合順序は、大文字・小文字を区別するかどうかや、ロケールごとの規則を決めるものです。多くのデフォルトの照合順序では、大文字が小文字より前に並ぶことがあるため、{'apple', 'Banana'} に対する MAX の結果には注意が必要です。
面接では、文字列に対する MIN/MAX の結果は照合順序に依存すると説明しましょう。この点まで理解していると、暗記した回答と本当の理解の違いが伝わります。
MIN(text) が意味しないこと
よくある誤解は、MIN(name) が最も短い文字列を、MAX(name) が最も長い文字列を返すというものです。しかし、そうではありません。これは長さではなく、純粋に並び順に基づいています。
実際に最も長い文字列が必要な場合は、LENGTH(name) で並べ替えて先頭の行を取得するか、長さだけが必要なら MAX(LENGTH(name)) を使用します。値の順序と長さを混同しないでください。
SELECT MAX(LENGTH(name)) AS longest_name_length
FROM employees;MIN/MAXは列を組み合わせない
重要な落とし穴があります。MIN と MAX は、それぞれ1つの列に対して独立して処理を行います。最小値または最大値を持つ行全体を返すわけではありません。
SELECT MIN(salary), name のように、GROUP BYなしで記述しても、最低給与の従業員の名前が得られるわけではありません。SQL方言によって、エラーになるか、任意の名前が返されます。行全体を取得するには、ORDER BY + LIMIT またはウィンドウ関数を使用します。
-- Wrong assumption: this does NOT give the lowest earner's name.
-- Correct approach to get the whole row:
SELECT name, salary
FROM employees
ORDER BY salary ASC
LIMIT 1;MIN/MAXにおけるNULLの挙動の再確認
SUM や AVG と同様に、MIN と MAX はNULLを無視します。NULLは最小値でも最大値でもありません。
- 実際の値とNULLが混在する場合:NULLは無視され、実際の最小値または最大値が返されます。
- すべてがNULL、または行が存在しない場合:MIN と MAX はNULLを返します。
この集約関数に共通する性質は、「標準的な集約関数はすべてNULLを無視します」と簡潔に説明できます。
グループ化して使う
MIN と MAX は、GROUP BY と組み合わせると、グループごとの最大値や最小値を求めるのに役立ちます。「部署ごとの最高給与」は典型的な例です。
このクエリは、部署ごとに1行を返し、その部署の最高給与を示します。ただし、返されるのは値であって従業員ではないことを覚えておいてください。その値と名前を組み合わせるのは、別途解決する一般的な課題です。
SELECT department, MAX(salary) AS top_salary
FROM employees
GROUP BY department;自信を持って答える方法
面接でのよい回答は次のようなものです。「MIN と MAX は、順序付け可能なあらゆる型に対して使えます。数値では最小値・最大値、日付では最も早い日付・最も遅い日付、文字列では列の照合順序に基づくアルファベット順の最初・最後の値を返します。NULLは無視し、NULLでない値が1つもない場合にのみNULLを返します。また、返すのは単一の値であり行全体ではないため、行を取得するには ORDER BY と LIMIT、またはウィンドウ関数を使用します。」
理解度チェック
文字列の集約について考えてみましょう。
まとめ
MIN と MAX についてのまとめです。
- 数値、日付、文字列など、あらゆる順序付け可能な型に対して使えます。
- 文字列では長さではなく、アルファベット順または照合順序に基づいて処理されます。
- 日付では、MIN = 最も早い日付、MAX = 最も遅い日付です。
- NULLを無視します。すべてがNULL、または行が存在しない場合はNULLを返します。
- 返すのは値であり、行全体ではありません。行全体が必要な場合は ORDER BY + LIMIT を使用します。
次は、GROUP BYなしで集約関数を使うとどうなるかを説明します。
よくある質問
「MIN、MAX、非数値の集計」レッスンは無料ですか?
はい。「MIN、MAX、非数値の集計」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Coding Interview Prepコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Coding Interview Prepコースには全4レッスンが含まれています。
「MIN、MAX、非数値の集計」で何を学びますか?
日付や文字列の集計と、テキストに対するMINの意味を学びます。 ブラウザで直接実行するハンズオンコードでCoding Interview Prepを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Coding Interview Prepを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのCoding Interview Prepは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「MIN、MAX、非数値の集計」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このCoding Interview Prepレッスンでコードを書いて実行できますか?
はい。すべてのCoding Interview Prepレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。