
group byした列以外のカラムを取得したい時って結構無いでしょうか?
今回解説する関数を使用すると、それが可能になります(Prestoだけ)
僕は今回、Tresurea Dataを使用しているのでPrestoが使えます。
一般的にSQLでは、group by を利用すると、group by した列以外の列はselect選択できません。
エラーになる例
id | date | value |
---|---|---|
1 | 2023/02/1 | aaa |
2 | 2023/2/15 | zzz |
3 | 2023/2/30 | bbb |
こんなテーブルがあった時…
#実行出来る場合
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列の値を返します。
id | date | value |
---|---|---|
1 | 2023/02/1 | aaa |
2 | 2023/2/15 | zzz |
3 | 2023/2/30 | bbb |
さっきのこの表の時…
SELECT max_by(value, date)
=> "bbb"
dateがMAXのレコードのvalueの値が取れます。
min_by()
お察しの通り、min_byは反対の値が取れます。
MIN_BY(値を取得したい列名, 最小値の対象となる列名)
min_by(x,y)の時、y列が最小値のx列の値を返します。
id | date | value |
---|---|---|
1 | 2023/02/1 | aaa |
2 | 2023/2/15 | zzz |
3 | 2023/2/30 | bbb |
さっきのこの表の時…
SELECT min_by(value, date)
=> "aaa"
dateがMINのレコードのvalueの値が取れます。
まとめ
group byした列以外のカラムを取得したい時、prestoであればmax_by()、min_by()の関数を使用することで可能になると言う事でした。
コメントを書く