В Postgres У меня есть запрос, который использует функцию табличного значения
SELECT
forecast.*
FROM (
SELECT
generate_series(begin_date, end_date, '1 mon'::interval)::date zdate
) zdate
LEFT JOIN LATERAL forecast_f(zdate.zdate)
forecast(forecast_version , source, forecast_date, gl_date, customer, program, rev) ON true
where 1=1;
, а прогноз_f выглядит так:
A lot of boiler plate and then:
BEGIN
return query
select * from table where a lot of parameters are pulled in.
Я пытаюсь сделать то же самое в Bigquery и искали в Google несколько необычных концепций: Генерация серии с передачей параметров в udf с правильным типом данных (всегда приключение) tvf
, а документации по TVF не так много. Я подумал, что может не обрабатываю tvfs, и мне пришлось бы объединить все это в столбец и как-то разделить его, когда он выходит из функции. Когда я гуглил, другие жаловались на особые случаи, когда TVF не работают, но это наводит на мысль, что есть случаи, когда они действительно работают, например, мой. Итак, я сделал это:
create or replace temp function snap(t timestamp)
as
(select * from forecast_stuff.forecast_full_practice where zfrom <= t and (zto> t or zto is null));
select * from snap(current_time())
, что не сработало. Кроме того, этот причудливый номер:
create or replace temp function snap(t timestamp)
as
((select intersection from forecast_stuff.forecast_full_practice where zfrom <= t and (zto> t or zto is null)));
select * from snap(current_time())
тоже не работал. Что-то о том, если не существует, не поддерживается во временных функциях. Я помню, как делал что-то подобное в f1 или dremel несколько лет назад. Разве они не продвинули технологию вперед?