web-dev-qa-db-ja.com

BigQueryでGROUPBYを使用したパーセンタイル関数

CENSUSの表では、州ごとにグループ化し、州ごとに郡の人口の中央値と郡の数を取得します。

Psql、redshift、snowflakeでは、これを行うことができます。

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
...

標準のBigQueryでこれを行うための素晴らしい方法を見つけようとしています。文書化されていないpercentile_cont分析関数が利用可能であることに気づきましたが、私はそれを私が望むものにするためにいくつかの主要なハックをしなければなりません。

私が収集したものと同じ種類のことを正しい引数で行えるようにしたいのですが。

SELECT
  state,
  COUNT(county),
  PERCENTILE_CONT(population2000,
    0.5) OVER () AS `medPop`
FROM
  CENSUS
GROUP BY
  state;

しかし、このクエリはエラーを生成します

SELECT list expression references column population2000 which is neither grouped nor aggregated at

私はcan必要な答えを得ますが、これが私がやりたいことを行うための推奨される方法であるとしたら、とてもがっかりします。

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

私がやりたいことをするためのより良い方法はありますか?また、PERCENTILE_CONT関数はドキュメント化される予定ですか?

読んでくれてありがとう!

17
donhcd

関心をお寄せいただきありがとうございます。 PERCENTILE_CONTは開発中であり、GAになるとドキュメントを公開します。最初に分析関数としてサポートし、後で集計関数(GROUP BYを許可)としてサポートする予定です。これら2つのリリースの間で、より簡単な回避策は

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