2013-06-05 13 views
6

Sto facendo un GROUP BY e COUNT (*) su un set di dati e vorrei calcolare la percentuale di ciascun gruppo sul totale.Calcolare la percentuale del gruppo utilizzando GROUP BY

Ad esempio, in questa query, vorrei sapere quanto il conteggio () per ogni stato rappresenta oltre il totale (select count () da publicdata: samples.natality):

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

Ci sono diversi modi per farlo in SQL, ma non ho trovato un modo per farlo in Bigquery, qualcuno lo sa?

Grazie!

+1

Controllare ratio_to_report, una delle funzioni della finestra recentemente annunciate (ad esempio in una risposta) –

risposta

12

Controllare ratio_to_report, una delle funzioni della finestra recentemente annunciati:

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

Ho appena visto il post di ieri con le nuove funzionalità, questo è esattamente quello che volevo, grazie! – inaki

+0

C'è un modo per utilizzare ROUND con RATIO_TO_REPORT? O usare * 100 per il calcolo percentuale? Ricevo un errore "" OVER "" OVER "" alla riga 1, colonna 37. Mi aspettavo: ")" – tinkerr

3

È possibile eseguire un auto join rispetto al totale, utilizzando un valore fittizio come chiave. Per esempio:

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

Molte grazie Jordan, che è esattamente quello che volevo! – inaki