2015-09-09 7 views
5

私はそれぞれ約70000行のテーブルを少し内側のジョイントを介して若干大きな第2テーブルに結合しています。 count(a.business_column)とcount(*)は異なる結果を返します。前者は〜70000を正しく報告し、後者は〜200000を返します。しかし、これはcount(*)だけを選択した場合にのみ発生し、一緒に選択すると同じ結果(〜70000)が得られます。これはどのように可能ですか?BigQueryでcount(*)の値はどのくらい正確に決まっていますか?

select 
    count(*) 
    /*,count(a.business_column)*/ 

from table_a a 
inner join each table_b b 
    on b.key_column = a.business_column 
+2

完全なクエリをお願いしますか?おそらく爆発的な結合、または入れ子構造が平坦化されているでしょうか? –

+0

申し訳ありませんが、すぐにそれをしてください。私が言ったように、70000は正しい数です、結合は爆発しません。ネストされた結合が平坦化されている場合は、どうしたらよいですか? – oulenz

答えて

1

COUNT(*)は、完全なレコードをカウントする場合は、COUNT(0)を使用して、クエリで最も重複するフィールドをカウントします。

+1

これは文書化されていますか?そしてそれはどのくらい正確に機能しますか? count(\ *)はcount(\ *)とcount(a.business_column)の後に異なる結果を与えるのはなぜですか? – oulenz

+0

私は 'select count(*)from publicdata:samples.trigrams'をクエリすると、このテーブルにもフィールドが繰り返されているにもかかわらず、正確に行数である68,051,509を取得します。あなたが言っていることは、少なくとも一般的には真実ではないようです。 – oulenz

+0

COUNT(\ *)は、テーブル内ではなく、クエリ内のほとんどの繰り返しフィールドをカウントします。このクエリを考えてみましょう.publicdata:samples.trigramsからcell.value!= 'foo'のcount(*)を選択すると、cell.valueの繰り返しフィールドがカウントされるため、7,227,007,535が返されます。同じクエリ内のカウント(0)は68,051,509を生成します –

4

UPDATE:これがどのように働くかのステップの説明によってステップについては、BigQuery flattens when using field with same name as repeated field代わりを参照してください。


タイトル質問に答えるには:BigQueryのCOUNT(*)は常に正確です。

SQL COUNT(*)とCOUNT(列)の意味は意味的に異なるため、サンプルクエリはさまざまな方法で解釈できます。

参照:

select user.userid, count(email.subject) 
from user 
    inner join email on user.userid = email.userid 
group by user.userid; 

そのクエリが不明瞭であることが判明し、記事の著者は、このコメントを追加し、より明示的な1のためにそれを変更します:

あり http://www.xaprb.com/blog/2009/04/08/the-dangerous-subtleties-of-left-join-and-count-in-sql/

彼らはこのサンプルクエリを持っています

しかし、クエリの作成者が意味するものでない場合はどうなりますか?実際に知る方法はありません。 のクエリにはいくつかの意味がありますが、これらの意味をより明確に表現するためにクエリを書くいくつかの方法があります。 しかし、いくつかの理由から、最初のクエリは であいまいです。そして、このクエリを読んだ人はすべて、元の作者が何を意味していたのかを推測することになります。 、これがどのように動作するかのステップの説明によってステップのためにBigQuery flattens when using field with same name as repeated field代わりを参照してください。


UPDATE「私は...私は無事にこれを変更することができると思い 」。

+0

申し訳ありませんが、私はあなたが私の質問を誤解してしまうのではないかと心配しています。確かにcount(\ *)とcount(column)はnullに対して異なって振る舞います。つまり、count(\ *)を選択する点です。私が期待していなかったことと私が理解できないことは、count(\ *)が行数よりも大きく、count(column)と共に選択するとこれが変わるということです。私は、これが繰り返されたフィールドが平らになっていることと関係があるというあなたのコメントの中で正しいかもしれないと思うが、それは起こるべきではないだろうか? – oulenz

+0

これは、クエリがあいまいであり、BigQueryが結果を計算する前にクエリを解釈する方法を選択する必要があるためです。 1つの列が2つあるときに数値が変化するのは、クエリの一部である列に応じて2つの異なる方法であいまいさが解決されるためです。リンクされた記事が表示されている場合、あいまいさの例を示すために使用するサンプルクエリは、クエリと同様に顕著です。 –

+0

引用したサンプルクエリの関連性はまだわかりません。あいまいな唯一のことは、著者の意図があることです。クエリはemail.subject内のnull以外のフィールドの数を単純に与えます。私の例では、BigQueryはcount(column)をインクルードするかどうかによってcount(\ *)を別々に解決すると言っています。しかし、それは私の質問に答えることはできません* count(\ *)の数はcount(column)をインクルードすることによってどのように影響を受けますか?私は、なぜ(* *)が行数よりも何かである必要があるのはなぜか分かりませんが、これはあまり曖昧ではありません。 – oulenz

関連する問題