kakakakakku blog

Weekly Tech Blog: Keep on Learning!

DuckDB: SELECT * EXCLUDE で 一部のカラムを除外する

DuckDB in Action を読んでいたら,Chapter.3 に SELECT * EXCLUDE というシンタックスが出てきた.ほとんどのカラムが必要だけど,一部のカラムだけ除外したいときに使える.これは使える場面があるな〜と思って実際に試してみた❗️小ネタだけど検証ログを残しておく✍

データセット

DuckDB in Action を読みながら試せるデータセットは GitHub に公開されている.

github.com

今回は ch03/ch03_db/prices.parquet を使う.データ構造は以下のようになっている👌

⚫◗ DESCRIBE SELECT * FROM prices.parquet;
┌─────────────┬──────────────┬─────────┬─────────┬─────────┬─────────┐
│ column_name │ column_type  │  null   │   key   │ default │  extra  │
│   varchar   │   varchar    │ varchar │ varchar │ varchar │ varchar │
├─────────────┼──────────────┼─────────┼─────────┼─────────┼─────────┤
│ id          │ INTEGER      │ YES     │         │         │         │
│ value       │ DECIMAL(5,2) │ YES     │         │         │         │
│ valid_from  │ DATE         │ YES     │         │         │         │
│ valid_until │ DATE         │ YES     │         │         │         │
└─────────────┴──────────────┴─────────┴─────────┴─────────┴─────────┘

お試し1

まずは SELECT * で全レコードを取得する.

⚫◗ SELECT * FROM prices.parquet;
┌───────┬──────────────┬────────────┬─────────────┐
│  id   │    value     │ valid_from │ valid_until │
│ int32 │ decimal(5,2) │    datedate     │
├───────┼──────────────┼────────────┼─────────────┤
│     111.592018-12-012019-01-01  │
│    1011.472019-01-012019-02-01  │
│    1111.352019-02-012019-03-01  │
│    1211.232019-03-012019-04-01  │
│    1311.112019-04-012019-05-01  │
│    1410.952019-05-012019-06-01  │
│    158.602020-11-012023-01-01  │
│    168.602023-01-012024-02-01  │
│    178.642020-10-012020-11-01  │
│    188.772020-09-012020-10-01  │
│    198.902020-08-012020-09-01  │
│    209.032020-07-012020-08-01  │
│    219.172020-06-012020-07-01  │
│    229.302020-05-012020-06-01  │
│    239.442020-04-012020-05-01  │
│    249.582020-03-012020-04-01  │
│    259.722020-02-012020-03-01  │
│    269.872020-01-012020-02-01  │
│    279.972019-12-012020-01-01  │
│    2810.082019-11-012019-12-01  │
│    2910.182019-10-012019-11-01  │
│    3010.332019-09-012019-10-01  │
│    3110.482019-08-012019-09-01  │
│    3210.642019-07-012019-08-01  │
│    3310.792019-06-012019-07-01  │
├───────┴──────────────┴────────────┴─────────────┤
│ 25 rows                               4 columns │
└─────────────────────────────────────────────────┘

お試し2

次に id カラムを除外して全レコードを取得する.今回試す SELECT * EXCLUDE を使わない場合は,個別に valuevalid_fromvalid_until を指定する必要がある.今回のデータセットはカラム数が少なくて問題なく感じるけど,もっとカラム数が増えてくると,個別に指定する大変さがある💨

⚫◗ SELECT value, valid_from, valid_until FROM prices.parquet;
┌──────────────┬────────────┬─────────────┐
│    value     │ valid_from │ valid_until │
│ decimal(5,2) │    datedate     │
├──────────────┼────────────┼─────────────┤
│        11.592018-12-012019-01-01  │
│        11.472019-01-012019-02-01  │
│        11.352019-02-012019-03-01  │
│        11.232019-03-012019-04-01  │
│        11.112019-04-012019-05-01  │
│        10.952019-05-012019-06-01  │
│         8.602020-11-012023-01-01  │
│         8.602023-01-012024-02-01  │
│         8.642020-10-012020-11-01  │
│         8.772020-09-012020-10-01  │
│         8.902020-08-012020-09-01  │
│         9.032020-07-012020-08-01  │
│         9.172020-06-012020-07-01  │
│         9.302020-05-012020-06-01  │
│         9.442020-04-012020-05-01  │
│         9.582020-03-012020-04-01  │
│         9.722020-02-012020-03-01  │
│         9.872020-01-012020-02-01  │
│         9.972019-12-012020-01-01  │
│        10.082019-11-012019-12-01  │
│        10.182019-10-012019-11-01  │
│        10.332019-09-012019-10-01  │
│        10.482019-08-012019-09-01  │
│        10.642019-07-012019-08-01  │
│        10.792019-06-012019-07-01  │
├──────────────┴────────────┴─────────────┤
│ 25 rows                       3 columns │
└─────────────────────────────────────────┘

お試し3

そこで SELECT * EXCLUDE を使うと,除外するカラムを指定できる👌

⚫◗ SELECT * EXCLUDE (id) FROM prices.parquet;
┌──────────────┬────────────┬─────────────┐
│    value     │ valid_from │ valid_until │
│ decimal(5,2) │    datedate     │
├──────────────┼────────────┼─────────────┤
│        11.592018-12-012019-01-01  │
│        11.472019-01-012019-02-01  │
│        11.352019-02-012019-03-01  │
│        11.232019-03-012019-04-01  │
│        11.112019-04-012019-05-01  │
│        10.952019-05-012019-06-01  │
│         8.602020-11-012023-01-01  │
│         8.602023-01-012024-02-01  │
│         8.642020-10-012020-11-01  │
│         8.772020-09-012020-10-01  │
│         8.902020-08-012020-09-01  │
│         9.032020-07-012020-08-01  │
│         9.172020-06-012020-07-01  │
│         9.302020-05-012020-06-01  │
│         9.442020-04-012020-05-01  │
│         9.582020-03-012020-04-01  │
│         9.722020-02-012020-03-01  │
│         9.872020-01-012020-02-01  │
│         9.972019-12-012020-01-01  │
│        10.082019-11-012019-12-01  │
│        10.182019-10-012019-11-01  │
│        10.332019-09-012019-10-01  │
│        10.482019-08-012019-09-01  │
│        10.642019-07-012019-08-01  │
│        10.792019-06-012019-07-01  │
├──────────────┴────────────┴─────────────┤
│ 25 rows                       3 columns │
└─────────────────────────────────────────┘

もちろん複数カラムを除外することもできる👌

⚫◗ SELECT * EXCLUDE (id, value) FROM prices.parquet;
┌────────────┬─────────────┐
│ valid_from │ valid_until │
│    datedate     │
├────────────┼─────────────┤
│ 2018-12-012019-01-01  │
│ 2019-01-012019-02-01  │
│ 2019-02-012019-03-01  │
│ 2019-03-012019-04-01  │
│ 2019-04-012019-05-01  │
│ 2019-05-012019-06-01  │
│ 2020-11-012023-01-01  │
│ 2023-01-012024-02-01  │
│ 2020-10-012020-11-01  │
│ 2020-09-012020-10-01  │
│ 2020-08-012020-09-01  │
│ 2020-07-012020-08-01  │
│ 2020-06-012020-07-01  │
│ 2020-05-012020-06-01  │
│ 2020-04-012020-05-01  │
│ 2020-03-012020-04-01  │
│ 2020-02-012020-03-01  │
│ 2020-01-012020-02-01  │
│ 2019-12-012020-01-01  │
│ 2019-11-012019-12-01  │
│ 2019-10-012019-11-01  │
│ 2019-09-012019-10-01  │
│ 2019-08-012019-09-01  │
│ 2019-07-012019-08-01  │
│ 2019-06-012019-07-01  │
├────────────┴─────────────┤
│ 25 rows        2 columns │
└──────────────────────────┘

関連記事

kakakakakku.hatenablog.com