グループを数えてフィルタリングする
基準値を満たすグループを見つける方法と、「N件を超える注文がある顧客」という定番問題を学びます。
「グループを数えてフィルタリングする」はCoddyKit上の無料SQL Interview Prepレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSQL Interview Prep学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 SQL Interview Prepコースには全4レッスンが含まれています。
最もよくあるグループ化の質問
「N件を超える注文をした顧客を見つけてください」は、GROUP BYに関する面接問題の定番です。商品がX回を超えて販売されたケース、従業員が少なくともY人いる部署、ログイン数がZ回を超える日など、さまざまな形で頻繁に出題されます。
どれも同じパターンです。グループ化し、件数を数え、HAVINGでグループを絞り込みます。
ステップ1:グループごとに数える
まず、各グループ内の行数を数えます。「顧客」や「商品」を定義するキーでグループ化し、COUNT(*)を適用します。
これにより、サイズ情報を持つグループごとに1行が得られます。まだ絞り込みは行っておらず、各グループの規模を測っているだけです。
SELECT customer_id, COUNT(*) AS order_count
FROM orders
GROUP BY customer_id;ステップ2:HAVINGで絞り込む
次に、しきい値を満たすグループだけを残します。条件は集約値に対するものなので、WHEREではなくHAVINGに記述する必要があります。
「注文を顧客ごとにグループ化し、件数が5件を超える顧客だけを残す」と解釈してください。これは、定番の質問に対する完全な回答です。
SELECT customer_id, COUNT(*) AS order_count
FROM orders
GROUP BY customer_id
HAVING COUNT(*) > 5;COUNT(DISTINCT)とCOUNT(*)の違い
問題文の表現に注意してください。「3種類を超える異なる商品を注文した顧客」には、COUNT(*)ではなくCOUNT(DISTINCT product_id)が必要です。
COUNT(*)はグループ内の行数を数えます。COUNT(DISTINCT col)はNULLではない一意の値を数えます。
面接官は、DISTINCTを使うべきか確認するために、問題文へ「異なる」や「一意の」という言葉を入れます。
SELECT customer_id, COUNT(DISTINCT product_id) AS distinct_products
FROM orders
GROUP BY customer_id
HAVING COUNT(DISTINCT product_id) > 3;COUNTではなくSUMで絞り込む
同じ構造で合計値も扱えます。「合計で1000を超える金額を使った顧客」では、顧客ごとにグループ化し、SUM(amount)で絞り込みます。
HAVINGの条件には、COUNT、SUM、AVG、MAX、MINなど、どの集約関数でも使用できます。問題文が示す指標を見れば、どの集約値で絞り込むべきか判断できます。
SELECT customer_id, SUM(amount) AS total_spent
FROM orders
GROUP BY customer_id
HAVING SUM(amount) > 1000;複数のグループ条件
HAVINGでは、異なる集約値を含む条件をANDやORで組み合わせられます。「注文数が5件を超え、かつ平均注文額が100を超える顧客」は、1つのHAVING句で表現できます。
各条件はそれぞれの集約値を参照し、すべてグループ化の後に評価されます。これにより、複合的なビジネスルールを明確に表現できることが分かります。
SELECT customer_id,
COUNT(*) AS orders,
AVG(amount) AS avg_order
FROM orders
GROUP BY customer_id
HAVING COUNT(*) > 5 AND AVG(amount) > 100;WHEREとHAVINGを組み合わせる
数える前に行を絞り込まなければならないこともよくあります。「今年の注文に限り、5件を超える注文をした顧客」を求める場合は、日付の条件にWHERE、件数の条件にHAVINGを使います。
まずWHEREで行数を減らし、その後にグループ化とHAVINGのしきい値を適用します。1つのクエリで両方の句を正しく使えることが、中級レベルの理解を示します。
SELECT customer_id, COUNT(*) AS orders_this_year
FROM orders
WHERE order_date >= '2024-01-01'
GROUP BY customer_id
HAVING COUNT(*) > 5;重複を見つける
よく似た例として、「重複するメールアドレスを見つける」があります。一意であるべき列でグループ化し、件数が1を超えるグループだけを残します。
この1つのパターンで、重複キー、重複する取引、想定以上に出現する値などを検出できます。面接官は、グループ化を重複排除の手段として捉えられるか確認するために質問します。
SELECT email, COUNT(*) AS times_seen
FROM users
GROUP BY email
HAVING COUNT(*) > 1;件数がちょうど一致するグループ
しきい値は必ずしも「より大きい」とは限りません。「注文がちょうど1件ある顧客」には HAVING COUNT(*) = 1 を使い、「少なくとも3件」には >= 3 を使います。
問題文にある境界を示す言葉を聞き分けてください。「より多い」、「少なくとも」、「ちょうど」、「より少ない」は、それぞれ異なる比較演算子に対応します。面接官は、この正確さを確認します。
-- One-time customers
SELECT customer_id, COUNT(*) AS orders
FROM orders
GROUP BY customer_id
HAVING COUNT(*) = 1;キーだけを返す
問題文によっては、件数ではなく条件を満たす識別子だけを求められることがあります。多くの場合、それを別のクエリに渡すためです。その場合もグループ化してフィルタリングしますが、SELECTするのはキーだけです。
その後、このクエリを IN サブクエリで包むか、JOINして該当する顧客の完全なレコードを取得できます。このようなクエリの組み立て方を理解していると、シニアらしさが伝わります。
SELECT customer_id
FROM orders
GROUP BY customer_id
HAVING COUNT(*) > 5;面接対策
「しきい値を満たすグループ」を問う問題では、次の4段階を声に出して説明してください。(1)グループ化のキーを特定する、(2)集計する指標を選ぶ、(3)問題文から比較演算子を決める、(4)行のフィルターをWHEREに、集計結果のフィルターをHAVINGに置く。
このテンプレートで、件数を数えてフィルタリングする問題群全体を解けます。
確認問題
問題文に合う正しいクエリを選んでください。
まとめ
パターン:キーでグループ化し、集計して、HAVINGでグループをフィルタリングします。これで「N件を超える注文」、「支出額の多い顧客」、重複、一度だけ利用した顧客を扱えます。
- 行数には
COUNT(*)を、重複しない値にはCOUNT(DISTINCT col)を使います。 - 比較演算子を問題文の表現に合わせます。
- 行のフィルターはWHEREに、集計結果のフィルターはHAVINGに置きます。
- INサブクエリやJOINに渡す場合は、キーだけをSELECTします。
よくある質問
「グループを数えてフィルタリングする」レッスンは無料ですか?
はい。「グループを数えてフィルタリングする」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、SQL Interview Prepコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 SQL Interview Prepコースには全4レッスンが含まれています。
「グループを数えてフィルタリングする」で何を学びますか?
基準値を満たすグループを見つける方法と、「N件を超える注文がある顧客」という定番問題を学びます。 ブラウザで直接実行するハンズオンコードでSQL Interview Prepを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
SQL Interview Prepを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのSQL Interview Prepは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「グループを数えてフィルタリングする」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このSQL Interview Prepレッスンでコードを書いて実行できますか?
はい。すべてのSQL Interview Prepレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- SELECT列に関するGROUP BYのルール
- HAVINGとWHEREの違い
- 複数列と式でグループ化する
- グループを数えてフィルタリングする