create or replace function mcPi(n) as ( with recursive cte as ( select -1 as i, 0 as count, NULL::DOUBLE as x, NULL::DOUBLE as y union all select i+1 as i, count + if( x*x + y*y <= 1, 1, 0) as count, random() as x, random() as y from cte where i < n ) select last( 4 * count / n order by i) from cte ); # Examples: select n, mcPi, format('{:.5f}', (mcPi - pi()) / pi()) as "relative error" from (select n, mcPi(n) as mcPi from (select unnest([100, 1000, 10000, 100000, 200000]) as n));