¡Es el Día de Pi! Calculemos pi con SQL
¡Feliz Día de Pi! Se nos ocurrió que sería divertido calcular pi con consultas SQL en ClickHouse. Esto es lo que hemos logrado hasta ahora…
- Este ejemplo usa la table function
numbers_mtde ClickHouse para devolver 1B filas y solo tarda 40 ms en calcularlo:
SELECT 4 * sum(if(number % 2, -1, 1) / ((number * 2) + 1)) AS pi
FROM numbers_mt(1000000000.)
┌- El siguiente ejemplo también procesa 1000 millones de números, aunque no tan rápido:
SELECT 3 + (4 * sum(if((number % 2) = 0, if((number % 4) = 0, -1 / ((number * (number + 1)) * (number + 2)), 1 / ((number * (number + 1)) * (number + 2))), 0))) AS pi
FROM numbers_mt(2, 10000000000)
┌- Este es, sin duda, nuestro favorito en ClickHouse (¡y el más preciso!):
SELECT pi()
┌- Quien hizo esto sabía de trigonometría:
SELECT 2 * asin(1) AS pi
┌- Aquí tienes una API útil que te permite especificar el número de dígitos que quieres:
SELECT *
FROM url('https://api.pi.delivery/v1/pi?start=0&numberOfDigits=100', 'JSONEachRow')
┌- Este es ingenioso - usa las funciones de distancia de ClickHouse:
WITH random_points AS
(
SELECT (rand64(1) / pow(2, 64), rand64(2) / pow(2, 64)) AS point
FROM numbers(1000000000)
)
SELECT (4 * countIf(L2Norm(point) < 1)) / count() AS pi
FROM random_points
┌- Si eres físico, quedarás satisfecho con este:
SELECT 22 / 7
┌- Otro método indirecto (este se lo debemos a Alexey Milovidov), preciso hasta 7 decimales y además rápido:
WITH
10 AS length,
(number / 1000000000.) * length AS x
SELECT pow((2 * length) * avg(exp(-(x * x))), 2) AS pi
FROM numbers_mt(1000000000.)
┌