LoginSignup
2
0

More than 1 year has passed since last update.

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

Last updated at Posted at 2021-12-18

はじめに

とある別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って言われたらお名前の付け方が怪しいかもしれません。
参考になれば幸いです。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0