Nézzük egy példán1 belül a binning/bucketing mindhárom típusát:
select
last_name,
salary,
-- equiheight binning
ntile(4) over (order by salary) as quartile,
-- equiwidth binning
width_bucket(salary, 0, max(salary+1) over (), 4) as bucket,
-- custom binning
case
when salary < 10 then
'low'
when salary < 24 then
'mid'
else
'high'
end as salary_group
from employees
order by salary
;
Equiheight binning (ntile)
Az ntile(n)
egy ablak függvény (window/analytic function), visszatérési értéke 1..n, a vödör száma. Ugyanannyi darab rekord kerül minden vödörbe (avagy a histogram oszlopai azonos magasságúak), a maradék darabszámot egyesével szétosztja az 1. vödörrel kezdve.2
Pl. AAAABCDEF 3 db vödörbe sorolva: 1: AAA, 2: ABC, 3: DEF. (‘A’ rekord két vödörbe is került.)
Pl. AAAABCDEFG 3 db vödörbe sorolva: 1: AAAA, 2: BCD, 3: EFG. (Az 1. vödörbe eggyel több rekord került.)
Equiwidth binning (width_bucket)
A width_bucket(expr, min, max, n)
függvény számokat vagy dátumokat osztályoz, a megadott (alul zárt, felül nyitott) értékintervallumot egyenlő részekre osztja (avagy a histogram oszlopai azonos szélességűek). Visszatérési értéke 0..n+1, a vödör száma (0, ha expr < min; n+1, ha expr >= max; különben 1..n).3
Custom binning
Ez egyszerűen egy case when
besorolás tetszőleges feltételekkel.
-
A példák innen: NTILE vs WIDTH_BUCKET. talkapex.com, 2014-04-12. ↩︎
-
PostgreSQL Documentation: Mathematical Functions and Operators ↩︎