web-dev-qa-db-fra.com

fonctions de centile avec GROUPBY dans BigQuery

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!

17
donhcd

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
18
Mingyu Zhong