bigqueryでkeepのdense_rank的なことをやりたい



oracleでたまにやってる、group by をした時に一番小さいx行の他の項目を出したい、っていうやつ。
これ、bigqueryだとkeepが無いのでどうやるのかな、と思って調べました。

oracleのパターン
select key
          , min(log_day) as log_day
          , min(log_name) keep (DENSE_RANK FIRST ORDER BY log_day) as log_name 
 from table
 group by key

keyでgroup by した時、一番小さいlog_dayを出し、そのデータのlog_nameを出す
keepがないので、bigqueryだと以下のようなアプローチになりました。
(他にも方法はあります)
select key
          , min(log_day) as log_day
  , array_agg(log_name order by log_day limit 1)[ordinal(1)]
 from table
 group by key

一旦array_aggで横持ちして、その1要素目を持ってくる。
速度的な計測はしてないけど、一旦効率は悪くなさそう。


参考
https://stackoverflow.com/questions/68133901/translating-oracle-sql-dense-rank-function-to-bigquery