2015-09-09 11 views
5

Dołączam do stołu złożonego z około 70000 rzędów z nieco większym drugim stołem poprzez wewnętrzny łączący każdy. Teraz licz (a.business_column) i count (*) dają różne wyniki. Ten pierwszy poprawnie zgłasza ~ 70000, podczas gdy drugi daje ~ 200000. Ale dzieje się tak tylko wtedy, gdy sam wybieram count (*), gdy je wybiorę, dają one ten sam wynik (~ 70000). Jak to jest możliwe?Jak dokładnie określa się wartość count (*) w BigQuery?

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

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

Pełne zapytania, proszę? Prawdopodobnie wybuchające sprzężenie, lub zagnieżdżone struktury są spłaszczone? –

+0

Przepraszam, powinienem był to zrobić natychmiast. Tak jak mówiłem, 70000 to poprawna liczba, połączenie nie eksploduje. Jeśli zagnieżdżone połączenia są spłaszczane, to w jaki sposób? – oulenz

Odpowiedz

1

COUNT (*) liczy najbardziej powtarzalne pola w zapytaniu, jeśli chcesz liczyć pełną dokumentację - Zastosowanie COUNT (0).

+1

Czy to jest udokumentowane? I jak dokładnie to działa? Dlaczego count (\ *) daje inny wynik zliczania (\ *), po którym następuje liczba (a.business_column)? – oulenz

+0

Kiedy wysyłam zapytanie 'select count (*) from publicdata: samples.trigrams', otrzymuję 68 051 509, czyli dokładnie tyle wierszy, mimo że ta tabela również zawiera powtarzające się pola. Więc to, co mówisz, nie wydaje się być prawdziwe, przynajmniej nie w ogóle. – oulenz

+0

COUNT (\ *) zlicza najczęściej powtarzane pole w zapytaniu, a nie w tabeli. Rozważmy to zapytanie - wybierz liczbę (*) z publicdata: samples.trigrams, gdzie cell.value! = 'Foo', zwróci 7 227 007 535, ponieważ policzy pole powtarzane cell.value.count (0) w tej samej kwerendzie daje 68,051,509 –

4

UPDATE:Dla wyjaśnienia krok po kroku, w jaki sposób to działa, zobaczBigQuery flattens when using field with same name as repeated fieldzamiast.


Aby odpowiedzieć na pytanie tytułowe: COUNT (*) w BigQuery jest zawsze dokładne.

Ograniczeniem jest to, że w SQL COUNT (*) i COUNT (kolumna) mają semantycznie różne znaczenia - a przykładowe zapytanie może być interpretowane na różne sposoby.

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

Nie mają tej kwerendy próbki:

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

To zapytanie okazuje się być ambigous, a autor artykułu zmienia się na bardziej wyraźnej jednego, dodając ten komentarz:

Ale co, jeśli nie to oznacza autor zapytania? Nie ma sposobu, aby naprawdę wiedzieć. Istnieje kilka możliwych znaczeń zamierzonych dla zapytania , a istnieje kilka różnych sposobów napisania zapytania do wyraźniej wyrazić te znaczenia. Ale pierwotne zapytanie jest niejednoznaczne z kilku powodów. I każdy, kto przeczyta to zapytanie, później skończy się odgadywaniem, co znaczył oryginalny autor. „ myślę, że mogę bezpiecznie zmienić to ...”


UPDATE:Dla wyjaśnienia krok po kroku, w jaki sposób to działa, zobaczBigQuery flattens when using field with same name as repeated fieldzamiast.

+0

Przykro mi, ale obawiam się, że źle rozumiesz moje pytanie. Z pewnością liczba (\ *) i liczba (kolumna) zachowują się inaczej w odniesieniu do wartości zerowej, to jest kwestia wyboru liczby (\ *). Czego się nie spodziewałem i czego nie rozumiem, to to, że liczba (\ *) jest większa niż liczba wierszy, i to się zmienia, gdy wybieram ją wraz z liczbą (kolumną). Podejrzewam, że możesz mieć rację w swoim komentarzu, że ma to coś wspólnego z tym, że powtarzane pola są spłaszczone, ale tak się nie powinno stać, prawda? – oulenz

+0

Dzieje się tak, ponieważ zapytanie jest niejednoznaczne - a BigQuery musi wybrać sposób interpretacji zapytania przed obliczeniem wyniku. Zmiana liczby, gdy masz jedną kolumnę lub dwie, polega na tym, że dwuznaczność rozwiązano na 2 różne sposoby, w zależności od tego, które kolumny są częścią zapytania. Jeśli zobaczysz powiązany artykuł, przykładowe zapytanie, które posłuży do pokazania przykładu niejednoznaczności, jest niezwykłe, podobnie jak zapytanie. –

+0

Nadal nie widzę znaczenia przykładowego zapytania, które cytujesz. Jedyną rzeczą, która jest niejednoznaczna, jest zamiar autora, zapytanie po prostu podaje liczbę niezerowych pól w email.subject. Mówisz, że w moim przykładzie BigQuery rozwiązuje count (\ *) inaczej, w zależności od tego, czy uwzględniam również count (kolumna). Ale to nie odpowiada na moje pytanie * jak * rozdzielczość liczenia (\ *) zależy od włączenia liczby (kolumny). Nie rozumiem, dlaczego ktoś chciałby, aby count (\ *) był cokolwiek innego niż liczba wierszy, co jest * nie * niejednoznaczne. – oulenz

Powiązane problemy