0

6 つのビンを持つコロプレス マップの場合ntile()、PostgreSQL 9.4 で各値をそれぞれのグループにビン化するために使用しています。

WITH cte AS (
  SELECT random() * 99 + 1 AS value
  FROM generate_series(1, 1000)
)
SELECT value, ntile(6) OVER (ORDER BY value) AS ntile
FROM cte;

結果:

   value    |    ntile
   ---------+----------
    1.08    |        1
    1.11    |        1
   ...      |      ...

しかし、最近、CartoDB ( https://github.com/CartoDB/cartodb-postgresql/blob/master/scripts-available/CDB_QuantileBins.sql )のおかげでいくつかのビニング SQL 関数に出くわし、この関数をアプリケーションに組み込みたいと思いました。私が遭遇した問題は、CartoDB 関数が配列を返し、その時点で各値をそれぞれのビンに配置する方法を見つけなければならないことです。おそらく関数を使用してこれを行うネイティブSQLの方法はありますwindowか、それともカスタム関数を使用して行う必要がありますか?

WITH cte AS (
  SELECT ARRAY_AGG(random() * 99 + 1) AS vals
  FROM generate_series(1,1000)
)
SELECT CDB_QuantileBins((SELECT vals FROM cte)::numeric[], 6);

結果:

cdb_quantilebins                                             
-----------------------
 {19.0055054393597,37.2587848943658,53.8059964138083,67.6696971417405,84.0905840680934,99.8241742462851}
4

2 に答える 2

0

誰かが値の形式で結果を探している場合に備えて| | ビン番号

WITH cte AS (
  SELECT random() * 99 + 1 AS vals
  FROM generate_series(1,1000)
),
bins AS (
SELECT bin, row_number() OVER () AS rank FROM (
SELECT UNNEST(CDB_QuantileBins((SELECT ARRAY_AGG(vals) FROM cte)::numeric[], 6)) bin
) as f
)
SELECT vals, MIN(rank) AS bin_number
FROM cte
JOIN bins 
ON bins.bin >= cte.vals
GROUP BY vals
于 2015-07-26T19:16:17.717 に答える