Diary

@ssig33

SQL で 10 行に 1 個ずつデータを取得したい

何を言ってんだ?って感じですが時系列に記録されているデータの場合そういうこともあると思います、今あった。

colum type 用途
body STRING JSON がドカッと入ってる
created_at NUMBER 作成日時が入っている

こんな雑なテーブルがあるとする。で、これにたいして created_at で並べたのにたいして 10 行に 1 個合計 50 行取得したい場合以下のようにすればよい。

select * from(
  select 
    JSON_EXTRACT_SCALAR(body, '$.nanika.nanika[0].nanika') as nanika, 
    created_at, 
    ROW_NUMBER() OVER (ORDER BY created_at DESC) as number
    from `garbage_table`
  )
where MOD(number, 10) = 0
imit 50;

今必要に迫られて書いたのがだいたいこんなんだったんですがもっとシンプルに書けるかもしれない。

常識的に考えればこんなクエリ吐いたりすることなんてまずないんですが、常識が通じないシチュエーションはあるし、そういう時 BigQuery であればこんなクエリにたいしてもすばやく結果を返してくれる。よかったですね。

14 Dec 2020 Mon 09:34 (UTC)