集約関数,Group By句,ウィンドウ関数,OVER句を使ってグループの特徴量を計算する

まずはテストデータテーブルを作成

DROP TABLE IF EXISTS score_table;

CREATE TABLE score_table (
  amazon_user_id text,
  product_id text,
  score numeric
);

INSERT INTO score_table (amazon_user_id, product_id, score)
  VALUES ('U0001', 'P001', '3.0'), ('U0001', 'P002', '4.0'), ('U0001', 'P003', '5.0'), ('U0002', 'P001', '4.0'), ('U0002', 'P002', '3.0'), ('U0002', 'P003', '4.0'), ('U0003', 'P001', '2.0'), ('U0003', 'P002', '5.0'), ('U0003', 'P003', '1.0');
 

Amazonユーザーが製品ごとに星による評価(⭐️1〜5個)をしたデータがあったとします。

 amazon_user_id | product_id | score 
----------------+------------+-------
 U0001          | P001       |   3.0
 U0001          | P002       |   4.0
 U0001          | P003       |   5.0
 U0002          | P001       |   4.0
 U0002          | P002       |   3.0
 U0002          | P003       |   4.0
 U0003          | P001       |   2.0
 U0003          | P002       |   5.0
 U0003          | P003       |   1.0
(9 rows)

こんな感じですね。

product_id がP001, P002, P003があってそれぞれについてスコアを付けています。

テーブル全体の行数,ユーザーの人数,製品の種類,スコアの平均値,最高スコア,最低スコアを計算する

SELECT
  COUNT(*) AS total_count,
  COUNT(DISTINCT amazon_user_id) AS user_count,
  COUNT(DISTINCT product_id) AS product_count,
  SUM(score) AS sum,
  AVG(score) AS avg,
  MAX(score) AS max,
  MIN(score) AS min
FROM
  score_table;
 total_count | user_count | product_count | sum  |        avg         | max | min 
-------------+------------+---------------+------+--------------------+-----+-----
           9 |          3 |             3 | 31.0 | 3.4444444444444444 | 5.0 | 1.0
(1 row)

DISTINCTを使うとユニークな文字列をカウントします。

この例では同じamazon_user_idを持つ場合は一つとしてカウントするわけです。

全行数は9行ありますが、ユニークなamazon_user_idはU001, U002, U003しかないわけですから、DISTINCT句を使うことによってuser_countは3つとして計算されます。

グルーピングしたデータごとに行数,ユーザーの人数,製品の種類,スコアの平均値,最高スコア,最低スコアを計算する

GROUP BY を使ってグループ化すると便利ですよね。

 

コメント