Amazon RedshiftのLISTAGGを使って集計内容をリスト化する

集計関数のLISTAGG

先日、Redshiftに新しくLISTAGG関数が追加されました。これは、グルーピングした値集合をリストで表示することができます。分析用とではわりとよく使いそうですね。Redshiftに接続して簡単なサンプルを試してみたいと思います。

Redshiftのバージョン確認

Redshiftの最小構成クラスタを立ち上げます。そして、接続したら以下のクエリーを投げます。ここで、Redshiftのバージョンが1.0.975以上であればOKです。新しい集計関数に対応しています。私はオレゴンリージョンで試したら使えました。東京リージョンは未だでしたが、すぐに対応するでしょう。

> select VERSION()
PostgreSQL 8.0.2 on i686-pc-linux-gnu, 
compiled by GCC gcc (GCC) 3.4.2 20041017 (Red Hat 3.4.2-6.fc3), 
Redshift 1.0.975

サンプルデータの作成

次にクエリーを投げる対象となるテーブルなどを作成します。

> CREATE USER satoshi password '**********';
> CREATE SCHEMA AUTHORIZATION satoshi;
> CREATE TABLE satoshi.SALES (id int, name VARCHAR, age int,dept int, update_date date);

サンプルデータをインサートします。

> INSERT INTO satoshi.SALES (id,name,age,dept,update_date)VALUES(10,'satoshi',37,100,'2015-01-01');
> INSERT INTO satoshi.SALES (id,name,age,dept,update_date)VALUES(20,'akari',4,200,'2014-01-02');
> INSERT INTO satoshi.SALES (id,name,age,dept,update_date)VALUES(30,'yokota',10,200,'2013-01-02');
> INSERT INTO satoshi.SALES (id,name,age,dept,update_date)VALUES(40,'mama',1,200,'2012-01-03');
> INSERT INTO satoshi.SALES (id,name,age,dept,update_date)VALUES(50,'papa',40,100,'2011-01-03');

LISTAGG関数を使う

それではデータが揃いましたので、さっそく使ってみましょう。

まずは最も簡単な例です。idを並べました。

> SELECT LISTAGG(id,', ') WITHIN GROUP (ORDER BY id) FROM satoshi.SALES;

LISTAGG
----------------------
10, 20, 30, 40, 50

もう少し複雑にします。deptでグループ化してidリストとnameリストを並べました。

SELECT dept, 
LISTAGG(name,', ') WITHIN GROUP (ORDER BY name) AS names,
LISTAGG(id,', ') WITHIN GROUP (ORDER BY name) AS ids
FROM satoshi.SALES
GROUP BY dept 
ORDER BY dept;

dept    names                ids
------------------------------------
100     papa,satoshi         50, 10
200     akari,mama,yokota    20, 40, 30

ウィンドウ関数のLISTAGG

ウィンドウ関数にもLISTAGGが提供されていますので、こちらも試してみたいと思います。idでグループ化して、そのidが所属するLISTAGGの全体を表示しています。全部同じグループに属しているので同じものが行に並んでいます。

> SELECT LISTAGG(id,', ') WITHIN GROUP (ORDER BY id) OVER() FROM satoshi.SALES;

LISTAGG
----------------------
10, 20, 30, 40, 50
10, 20, 30, 40, 50
10, 20, 30, 40, 50
10, 20, 30, 40, 50
10, 20, 30, 40, 50

こちらは、idでグループ化して、同じdeptに所属しているidをLISTAGGで表示しています。

SELECT id, dept, LISTAGG(id,', ') WITHIN GROUP (ORDER BY id) OVER( PARTITION BY dept ) 
FROM satoshi.SALES
ORDER BY id;

id     dept     LISTAGG
----------------------
10     100     10, 50
20     200     20, 30, 40
30     200     20, 30, 40
40     200     20, 30, 40
50     100     10, 50

まとめ

Redshiftには様々な集計関数やウィンドウ関数があります。今回は、グループ化した結果セットをリスト取得するLISTAGGを学びました。Redshiftを使っている方は、集計して分析することが多々あると思います。集計関数やウィンドウ関数を押さえて、ビジネスに役立つ情報をたくさん収集しましょう。

参考資料

Amazon Redshift Database Developer Guide - LISTAGG Function

Amazon Redshift Database Developer Guide - LISTAGG Window Function

Redshiftアップデート:WLMパラメータの動的変更と、LISTAGG関数の追加

Window関数 - 導入編