Страницы

Поиск по вопросам

воскресенье, 15 декабря 2019 г.

Выбор чисел Фибоначчи

#mysql #sql #postgresql #sqlite3


Задача не практическая. Хочется оценить, какими подходами ее можно решить на SQL'ях
разных диалектов (PostgreSQL, SQLite3, MySQL). И как сложно это решаемо.

Задача

Есть таблица с положительными числами [0..N]. Нужно вывести в порядке возрастания
все числа из указанной таблицы, которые входят в последовательность Фибоначчи.
    


Ответы

Ответ 1



Генератор без использования таблиц для SQLite, postgresql: WITH Recursive Q(Num,Prev) as( select 1,1 union all select Q.Num+Q.Prev,Q.Num from Q where Q.Num<10000 ) select Num from Q Если надо выбрать из них только те числа, что есть в некой таблице - то в итоговый select добавить join с этой таблицей для проверки наличия числа в ней. Для MS SQL и Oracle - убрать из запроса выше фразу Recursive. Для Oracle дополнительно добавить from DUAL после select 1,1. Для MySQL требуется опорная таблица с нужным количеством записей, содержимое этих записей значения не имеет: select @tmp:=@Prev+@Num as Num, @Prev:=@Num, @Num:=@tmp from seqnum, (select @Prev:=1, @Num:=1) A order by Num Это опять же генератор. Для проверки наличия в некой таблице - заключить в подзапрос и сделать join.

Ответ 2



Отвечаю сам себе :) пока для PostgreSQL: Решается в несколько этапов: 1) Поиск максимального значения в таблице 2) CROSS JOIN всей таблицы с результатом выборки от хранимой процедуры по соответствию CREATE OR REPLACE FUNCTION fib(f INTEGER) RETURNS SETOF INTEGER LANGUAGE SQL AS $$ WITH RECURSIVE t(a,b) AS ( VALUES(0,1) UNION ALL SELECT greatest(a,b), a + b AS a FROM t WHERE b < $1 ) SELECT a FROM t; $$; где аргументом будет максимальное значение из таблицы Для SQLite3 и MySQL ждем-c ... ) Хотя, чего греха таить, возможно и для PostgreSQL без хранимой процедуры.

Комментариев нет:

Отправить комментарий