Dans mon tableau de RECENSEMENT, je voudrais regrouper par État, et pour chaque État obtenir la population médiane du comté et le nombre de comtés.
En psql, redshift et snowflake, je peux faire ceci:
psql=> SELECT state, count(county), PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY "population2000") AS median FROM CENSUS GROUP BY state;
state | count | median
----------------------+-------+----------
Alabama | 67 | 36583
Alaska | 24 | 7296.5
Arizona | 15 | 116320
Arkansas | 75 | 20229
...
J'essaie de trouver une belle façon de le faire dans BigQuery standard. J'ai remarqué qu'il n'y avait pas de documents percentile_cont
fonction analytique disponible, mais je dois faire quelques hacks majeurs pour qu'il fasse ce que je veux.
Je voudrais pouvoir faire la même chose avec ce que j'ai rassemblé sont les bons arguments:
SELECT
state,
COUNT(county),
PERCENTILE_CONT(population2000,
0.5) OVER () AS `medPop`
FROM
CENSUS
GROUP BY
state;
mais cette requête renvoie l'erreur
SELECT list expression references column population2000 which is neither grouped nor aggregated at
Je peux obtenir la réponse que je veux, mais je serais très déçu si c'est la façon recommandée de faire ce que je veux faire:
SELECT
MAX(nCounties) AS nCounties,
state,
MAX(medPop) AS medPop
FROM (
SELECT
nCounties,
T1.state,
(PERCENTILE_CONT(population2000,
0.5) OVER (PARTITION BY T1.state)) AS `medPop`
FROM
census T1
LEFT OUTER JOIN (
SELECT
COUNT(county) AS `nCounties`,
state
FROM
census
GROUP BY
state) T2
ON
T1.state = T2.state) T3
GROUP BY
state
Y a-t-il une meilleure façon de faire ce que je veux faire? Est également le PERCENTILE_CONT
la fonction sera-t-elle jamais documentée?
Merci d'avoir lu!
Merci de votre intérêt. PERCENTILE_CONT est en cours de développement et nous publierons la documentation une fois GA. Nous la prendrons en charge en tant que fonction analytique en premier, et nous prévoyons de la prendre en charge en tant que fonction d'agrégation (permettant GROUP BY) plus tard. Entre ces 2 versions, une solution de contournement plus simple serait
SELECT
state,
ANY_VALUE(nCounties) AS nCounties,
ANY_VALUE(medPop) AS medPop
FROM (
SELECT
state,
COUNT(county) OVER (PARTITION BY state) AS nCounties,
PERCENTILE_CONT(population2000,
0.5) OVER (PARTITION BY state) AS medPop
FROM
CENSUS)
GROUP BY
state