2013-06-05 20 views
6

Robię GROUP BY i COUNT (*) na zestawie danych i chciałbym obliczyć procent każdej grupy w stosunku do całości.Oblicz procent grupy przy użyciu GROUP BY

Na przykład, w tym zapytaniu, chciałbym wiedzieć, ile licznik () za każdy stan reprezentuje ponad całkowitej (select count () z publicdata: samples.natality):

SELECT state, count(*) 
FROM [publicdata:samples.natality] 
GROUP by state 

Jest kilka sposobów, aby to zrobić w SQL, ale nie znalazłem sposobu, aby to zrobić w BigQuery, czy ktoś wie?

Dzięki!

+1

Sprawdź ratio_to_report, jeden z niedawno ogłoszonych funkcji okna (na przykład w odpowiedzi) –

Odpowiedz

12

Sprawdź ratio_to_report, jeden z niedawno ogłoszonych funkcji okna:

SELECT state, ratio * 100 AS percent FROM (
SELECT state, count(*) AS total, RATIO_TO_REPORT(total) OVER() AS ratio 
FROM [publicdata:samples.natality] 
GROUP by state 
) 

state percent 
AL  1.4201828131159113 
AK  0.23521048665998198 
AZ  1.3332896746620975 
AR  0.7709591206172346 
CA  10.008298605982642 
+0

Właśnie zobaczyłem wpis z wczoraj z nowymi funkcjami, dokładnie to chciałem, dzięki! – inaki

+0

Czy istnieje sposób użycia ROUND z RATIO_TO_REPORT? Lub użyj * 100 do obliczenia procentowego? Wystąpił błąd Napotkano "" PONAD "" PONAD "" w wierszu 1, kolumna 37. Spodziewał się: ")" – tinkerr

3

Możesz wykonać samo łączenie w stosunku do wartości całkowitej, używając wartości dummy jako klucza. Na przykład:

SELECT 
    t1.state AS state, 
    t1.cnt AS cnt, 
    100 * t1.cnt/t2.total as percent 
FROM (
    SELECT 
    state, 
    COUNT(*) AS cnt, 
    1 AS key 
    FROM 
    [publicdata:samples.natality] 
    WHERE state is not null 
    GROUP BY 
    state) AS t1 
JOIN (
    SELECT 
    COUNT(*) AS total, 
    1 AS key 
    FROM 
    [publicdata:samples.natality]) AS t2 
ON t1.key = t2.key 
ORDER BY percent DESC 
+0

Dziękujemy Jordan, dokładnie czego chciałem! – inaki