prestoでgroup by時に対象項目以外を抽出するクエリー。max_by/min_by

prestoでgroup by時に対象項目以外を抽出するクエリー。max_by/min_by

group byした列以外のカラムを取得したい時って結構無いでしょうか?
今回解説する関数を使用すると、それが可能になります(Prestoだけ)

僕は今回、Tresurea Dataを使用しているのでPrestoが使えます。

一般的にSQLでは、group by を利用すると、group by した列以外の列はselect選択できません。

エラーになる例

iddatevalue
12023/02/1aaa
22023/2/15zzz
32023/2/30bbb

こんなテーブルがあった時…

#実行出来る場合
select value from table group by value
#実行出来ない場合
select value,date from table group by value

こんな感じでgroup by した列以外は選択出来ないですよね。

しかし実際の利用の所、特定のフィールドが最大値の時に、指定した列を取得したい事があります。

prestoなら実現出来る

prestoには便利な関数がありました。
これ使用すれは実現できます。

それがこれです。

max_by()

MAX_BY(値を取得したい列名, 最大値の対象となる列名)

max_by(x,y)の時、y列が最大値のx列の値を返します。

iddatevalue
12023/02/1aaa
22023/2/15zzz
32023/2/30bbb

さっきのこの表の時…

SELECT max_by(value, date) 
=> "bbb"

dateがMAXのレコードのvalueの値が取れます。

min_by()

お察しの通り、min_byは反対の値が取れます。

MIN_BY(値を取得したい列名, 最小値の対象となる列名)

min_by(x,y)の時、y列が最小値のx列の値を返します。

iddatevalue
12023/02/1aaa
22023/2/15zzz
32023/2/30bbb

さっきのこの表の時…

SELECT min_by(value, date) 
=> "aaa"

dateがMINのレコードのvalueの値が取れます。

まとめ

group byした列以外のカラムを取得したい時、prestoであればmax_by()、min_by()の関数を使用することで可能になると言う事でした。

Databaseカテゴリの最新記事