[AWS]RedShiftではgenerate_series関数が使えない

ということなので代替の方法を使用する必要がある。
下記の記事を参考にした。

公式ドキュメントも参考にした。

列持ちデータを行持ちにする

過去に書いてた下記の記事のテーブルを使用する。

テーブルの構成は下記のような感じ。

create database testdb;
create table recommend_item (item_id int PRIMARY KEY, recommend_item_1 int, recommend_item_2 int, recommend_item_3 int, recommend_item_4 int);

まずPostgreSQLのgenerate_series()を使用するやり方。下記のように連番のテーブルを作成することで列持ちデータを行データに変換できる。

SELECT
    *
FROM
(
    SELECT
        item_id,
        CASE p.id
            WHEN 1 THEN r.recommend_item_1
            WHEN 2 THEN r.recommend_item_2
            WHEN 3 THEN r.recommend_item_3
            WHEN 4 THEN r.recommend_item_4
        END AS r_item_id
    FROM recommend_item AS r
    CROSS JOIN (
        SELECT generate_series(1, 4) AS id
    ) p
) sub
item_id | r_item_id
---------+-----------
       1 |         8
       1 |      3085
       1 |      3241
       1 |      3535
       2 |      1186
       2 |      2547
       2 |      6764
       2 |      6959
       3 |       716
       3 |      3546
       3 |      5804
       3 |      8174
       4 |      2563
       4 |      6874
       4 |      7527
       4 |      8290
       5 |      2124
       5 |      2690
       5 |      3318
       5 |      7319

代替の関数としてROW_NUMBER()を使用する。

SELECT
    *   
FROM
(
    SELECT
        item_id,
        CASE p.id
            WHEN 1 THEN r.recommend_item_1
            WHEN 2 THEN r.recommend_item_2
            WHEN 3 THEN r.recommend_item_3
            WHEN 4 THEN r.recommend_item_4
        END AS r_item_id
    FROM recommend_item AS r
    CROSS JOIN (
        SELECT
            ROW_NUMBER() OVER (ORDER BY true) AS id
        FROM recommend_item
        LIMIT 4
    ) p     
) sub

ということで変換ができた。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

nine − 8 =

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください