bigqqueryで四分位数を算出するコードがあまりなかったのでメモ投稿です

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
SELECT
  key
, min
  -- 配列にしたpercent情報からoffsetで割合算出
, percent[offset(25)] AS per_25 -- 第一四分位点
, percent[offset(50)] AS per_50 -- 第二四分位点
, percent[offset(75)] AS per_75 -- 第三四分位点
, max
FROM
(
  -- 四分位数を抽出するため、以下のように統計量を先に出す
  SELECT
key
, MIN(ranking) AS min
, MAX(ranking) AS max
-- ranking情報を割合で出せるように配列にする
, APPROX_QUANTILES(ranking, 100) AS percent
  FROM
dataset.table
GROUP BY
key
)
SELECT   key , min   -- 配列にしたpercent情報からoffsetで割合算出 , percent[offset(25)] AS per_25 -- 第一四分位点 , percent[offset(50)] AS per_50 -- 第二四分位点 , percent[offset(75)] AS per_75 -- 第三四分位点 , max FROM (   -- 四分位数を抽出するため、以下のように統計量を先に出す   SELECT key , MIN(ranking) AS min , MAX(ranking) AS max -- ranking情報を割合で出せるように配列にする , APPROX_QUANTILES(ranking, 100) AS percent   FROM dataset.table GROUP BY key )
SELECT
  key
 , min
  -- 配列にしたpercent情報からoffsetで割合算出
 , percent[offset(25)] AS per_25 -- 第一四分位点
 , percent[offset(50)] AS per_50 -- 第二四分位点
 , percent[offset(75)] AS per_75 -- 第三四分位点
 , max
FROM 
(
  -- 四分位数を抽出するため、以下のように統計量を先に出す
  SELECT
   key 
   , MIN(ranking) AS min
   , MAX(ranking) AS max
   -- ranking情報を割合で出せるように配列にする
   , APPROX_QUANTILES(ranking, 100) AS percent  
  FROM
  dataset.table
 GROUP BY
   key
)

上記のコードよりも効率的なコードがあったのでこちらも追記(2023/8/15)

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
SELECT
APPROX_QUANTILES(price, 4)[OFFSET(1)] as q1, -- 第1四分位数
APPROX_QUANTILES(price, 4)[OFFSET(2)] as median, -- 中央値
APPROX_QUANTILES(price, 4)[OFFSET(3)] as q3 -- 第3四分位数
FROM
dataset.table
SELECT APPROX_QUANTILES(price, 4)[OFFSET(1)] as q1, -- 第1四分位数 APPROX_QUANTILES(price, 4)[OFFSET(2)] as median, -- 中央値 APPROX_QUANTILES(price, 4)[OFFSET(3)] as q3 -- 第3四分位数 FROM dataset.table
SELECT
  APPROX_QUANTILES(price, 4)[OFFSET(1)] as q1, -- 第1四分位数
  APPROX_QUANTILES(price, 4)[OFFSET(2)] as median, -- 中央値
  APPROX_QUANTILES(price, 4)[OFFSET(3)] as q3 -- 第3四分位数
FROM
  dataset.table

上記は、APPROX_QUANTILES()関数での四分位数算出コード

この関数は、データを指定された数のバケットに分割し、各バケットの最大値を返します。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
SELECT
PERCENTILE_CONT(0.25) OVER(ORDER BY price) as q1, -- 第1四分位数
PERCENTILE_CONT(0.5) OVER(ORDER BY price) as median, -- 中央値
PERCENTILE_CONT(0.75) OVER(ORDER BY price) as q3 -- 第3四分位数
FROM
dataset.table
SELECT PERCENTILE_CONT(0.25) OVER(ORDER BY price) as q1, -- 第1四分位数 PERCENTILE_CONT(0.5) OVER(ORDER BY price) as median, -- 中央値 PERCENTILE_CONT(0.75) OVER(ORDER BY price) as q3 -- 第3四分位数 FROM dataset.table
SELECT
  PERCENTILE_CONT(0.25) OVER(ORDER BY price) as q1, -- 第1四分位数
  PERCENTILE_CONT(0.5) OVER(ORDER BY price) as median, -- 中央値
  PERCENTILE_CONT(0.75) OVER(ORDER BY price) as q3 -- 第3四分位数
FROM
  dataset.table

上記は、PERCENTILE_CONT()関数での四分位数算出コード

この関数は、与えられたパーセンタイルに対応する値を返します。

おすすめの記事