0
Help us understand the problem. What are the problem?

posted at

updated at

Organization

BigQueryにサブクエリのエイリアスを優先されてorder byがエラーになった話

はじめに

とある別DBのSQLをBigQueryで実行した時のこと。
最初からBigQueryで書く場合は、凡ミスとしてすぐ気づき、この事象に悩むことはないかもしれません。

が、今回のように別DBでは動くがBigQueryではエラーが出たケースです。

DBやデータをBigQueryに移した後同じクエリを実行しときは割と対面するようなので
そんな方は参考になるかなと思います。

例題テーブル

こんなテーブルを使います。
dataset: babynames
table_name: names2021

column type
name STRING
gender STRING
cnt INTEGER

正常クエリ

select
    name
    ,ranking
from (
  select 
    name
    ,cnt as ranking
  from
    babynames.names2021
) as ranking

この場合、クエリは成功しました。

エラーになるクエリ

select
    name
    ,row_number() over(partition by gender order by ranking)  as gender_rank
from (
select
    name
    ,gender
    ,cnt as ranking
from
    babynames.names20121
group by
    name
    ,gender
    ,cnt
) as ranking

すると・・・・

Ordering by expressions of type STRUCT is not allowed at 

こんなエラーが出ました。

原因

cntカラムのエイリアスとサブクエリのエイリアスがrankingという名前で重複しています。
order byで指定した名前は、サブクエリ内のカラム名よりサブクエリのエイリアス名が優先されたため
サブクエリのテーブルをSTRUCT型としてorder byしてるとみなされてエラーになりました。

STRUCT型についてはこちらを参照。

解決策

名前を被らないように変える。という手が一番手っ取り早いです。

select
    name
    ,ranking
    ,row_number() over(partition by gender order by ranking)  as b
from (
    select
        name
        ,gender
        ,count as ranking
    from
        babynames.names2010 
) as ranking_table

が、テーブルとして認識されたことを踏まえて操作したところ
(ちょっと気持ち悪いですが)以下のような書き方をすることでも解決は可能だったので記載しておきます。

select
    name
    ,ranking
    ,row_number() over(partition by gender order by ranking.ranking)  as b
from (
    select
        name
        ,gender
        ,count as ranking
    from
        babynames.names2010 
) as ranking

結論

もしorder by して STRUCT is not allowedって言われたらお名前の付け方が怪しいかもしれません。
参考になれば幸いです。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
0
Help us understand the problem. What are the problem?