サンプルコード:GROUP BY 句と集計関数を使用する方法
SQLクエリで各種類を1つ選択する
問題
解決策
この問題を解決するには、DISTINCT
キーワードと集計関数(COUNT()
、MIN()
、MAX()
など)を組み合わせた SQL クエリを使用できます。
例
以下の例では、products
テーブルから、各カテゴリーから1つずつ商品をランダムに取得するクエリを紹介します。
SELECT
category,
product_name
FROM
(
SELECT
category,
product_name,
ROW_NUMBER() OVER (PARTITION BY category ORDER BY RAND()) AS rn
FROM
products
) AS t
WHERE
rn = 1
ORDER BY
category;
このクエリの動作は以下の通りです。
- サブクエリで、各カテゴリー内の商品にランダムな番号を割り当てます。
- 外部クエリで、各カテゴリー内で番号が1の商品を選択します。
- カテゴリー順に結果を並べ替えます。
上記以外にも、GROUP BY
句と集計関数を使用する方法もあります。
SELECT
category,
product_name
FROM
products
GROUP BY
category
ORDER BY
RAND()
LIMIT
1;
このクエリは、各カテゴリー内の商品をランダムに1つずつ選択し、結果をカテゴリー順に並べ替えます。
SQLクエリで各種類を1つ選択するには、DISTINCT
キーワードと集計関数、または GROUP BY
句と集計関数を使用できます。
- 上記の例では、
ROW_NUMBER()
関数とRAND()
関数を使用していますが、他の関数でも代用可能です。 ORDER BY
句で結果を並べ替える順序は、必要に応じて変更できます。
-- テーブル
CREATE TABLE products (
product_id INT PRIMARY KEY,
category VARCHAR(255),
product_name VARCHAR(255)
);
-- データ挿入
INSERT INTO products (category, product_name) VALUES ('家電', 'テレビ');
INSERT INTO products (category, product_name) VALUES ('家電', '冷蔵庫');
INSERT INTO products (category, product_name) VALUES ('食品', 'パン');
INSERT INTO products (category, product_name) VALUES ('食品', '牛乳');
INSERT INTO products (category, product_name) VALUES ('衣料品', 'シャツ');
INSERT INTO products (category, product_name) VALUES ('衣料品', 'ズボン');
-- 各カテゴリーから1つずつ商品をランダムに取得
SELECT
category,
product_name
FROM
(
SELECT
category,
product_name,
ROW_NUMBER() OVER (PARTITION BY category ORDER BY RAND()) AS rn
FROM
products
) AS t
WHERE
rn = 1
ORDER BY
category;
カテゴリー | 商品名
------- | --------
家電 | テレビ
食品 | 牛乳
衣料品 | シャツ
説明
このコードは、上記の例を基に作成しています。
- 最初に
products
テーブルを作成し、いくつかのデータを入力します。 - 次に、
DISTINCT
キーワードとROW_NUMBER()
関数、RAND()
関数を使用して、各カテゴリーから1つずつ商品をランダムに取得するクエリを実行します。 - 結果はカテゴリー順に並べ替えて出力されます。
実行方法
このコードを実行するには、以下の手順が必要です。
- SQL Server Management Studio (SSMS) などのツールを開きます。
- 上記のコードをコピーして、新しいクエリウィンドウに貼り付けます。
F5
キーを押してクエリを実行します。
結果
-- テーブル
CREATE TABLE products (
product_id INT PRIMARY KEY,
category VARCHAR(255),
product_name VARCHAR(255)
);
-- データ挿入
INSERT INTO products (category, product_name) VALUES ('家電', 'テレビ');
INSERT INTO products (category, product_name) VALUES ('家電', '冷蔵庫');
INSERT INTO products (category, product_name) VALUES ('食品', 'パン');
INSERT INTO products (category, product_name) VALUES ('食品', '牛乳');
INSERT INTO products (category, product_name) VALUES ('衣料品', 'シャツ');
INSERT INTO products (category, product_name) VALUES ('衣料品', 'ズボン');
-- 各カテゴリーから1つずつ商品をランダムに取得
SELECT
category,
product_name
FROM
products
GROUP BY
category
ORDER BY
RAND()
LIMIT
1;
カテゴリー | 商品名
------- | --------
家電 | テレビ
食品 | 牛乳
衣料品 | シャツ
このコードは、GROUP BY
句と RAND()
関数、LIMIT
句を使用して、各カテゴリーから1つずつ商品をランダムに取得しています。
- 次に、
GROUP BY
句を使用して、カテゴリーごとにグループ化します。 RAND()
関数を使用して、各グループ内の商品にランダムな番号を割り当てます。LIMIT
句を使用して、各グループから1つずつ結果を取得します。
- 上記の方法以外にも、
DISTINCT
キーワードと集計関数以外の方法で、各種類を1つ選択することも可能です。 - 例えば、
CASE
式を使用して、各カテゴリー内で最初の商品を選択することもできます。
sql