bigqueryでkeepのdense_rank的なことをやりたい
oracleでたまにやってる、group by をした時に一番小さいx行の他の項目を出したい、っていうやつ。
これ、bigqueryだとkeepが無いのでどうやるのかな、と思って調べました。
oracleのパターン
(他にも方法はあります)
参考
https://stackoverflow.com/questions/68133901/translating-oracle-sql-dense-rank-function-to-bigquery
oracleでたまにやってる、group by をした時に一番小さいx行の他の項目を出したい、っていうやつ。
これ、bigqueryだとkeepが無いのでどうやるのかな、と思って調べました。
oracleのパターン
select keykeepがないので、bigqueryだと以下のようなアプローチになりました。
, 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を出す
(他にも方法はあります)
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
コメント