#sql #postgresql
#sql #postgresql
Вопрос:
У меня есть скрипт BigQuery для построения геометрической прогрессии от минимального термина к максимальному значению, используя dense as ratio. Он работает в BigQuery очень хорошо, но я хочу использовать его в PostgreSQL.
WITH calc as (SELECT 0.02 as min_cpm, 9.8 as max_cpm, 1.6 as dense)
SELECT min_cpm, max_cpm, dense, stage 1 stage,
IF (MOD(CAST(FLOOR(min_cpm * POWER(dense, stage)*1000) AS INT64),10)= 0, (CAST(FLOOR(min_cpm * POWER(dense, stage)*1000) AS INT64) 1 )/1000, CAST(FLOOR(min_cpm * POWER(dense, stage)*1000) AS INT64)/1000) as cpm,
FROM calc,
UNNEST(GENERATE_ARRAY(0, CAST(FLOOR(LOG(max_cpm/min_cpm) / LOG(dense)) AS INT64))) stage
Этот скрипт округляет каждое cpm
значение до трех символов после точки. И делает последний символ не равным 0
.
Итак, ожидаемый результат:
Возможно ли сделать это в PostgereSQL? Есть предложения.
Спасибо!
Ответ №1:
Это очень сложно. Но что-то вроде этого:
with calc as (
SELECT 0.02 as min_cpm, 9.8 as max_cpm, 1.6 as dense
)
select calc.*, stage 1,
FLOOR(min_cpm * POWER(dense, stage)*1000) / 1000
from calc cross join
generate_series(0, ceiling(LOG(max_cpm/min_cpm) / LOG(dense)), 1) stage ;
Комментарии:
1. Я хочу, чтобы последний термин был меньше максимального значения cpm. Как его изменить?
2. @Timogavk . . . Вычтите 1 из второго аргумента в
generate_series()
(хотяfloor()
также может делать то, что вы хотите).