Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Firebird, InterBase Новый топик    Ответить
 Решил поиграться с WITH RECURSIVE  [new]
o_v_a
Member

Откуда: Тула
Сообщений: 1071
Решил я тут на досуге, пень старый, поиграть с рекурсией.
Или поправьте меня, или оставлю просто для истории как лайфхак в конце концов.
Чтоб не забыть.

/* из таблицы сессий

CREATE TABLE TDS_SESSIONS (
    DTS      TIMESTAMP,  -- время установления сессии
    ACCEPT   SMALLINT, -- 0/1 разрешено или отказано
    -- остальные поля неважны и опущены
);
надо сделать выборку за 15-тиминутные интервалы времени начиная от текущего 7 суток назад
и подсчитать количество успехов и количество отказов сессий
*/

WITH recursive temp(time_start, time_stop)
AS (
-- нерекурсивная часть. Выборка первого и самого раннего 15-минутного интервала.
 SELECT current_timestamp-7 as time_start, dateadd(Minute,15,current_timestamp-7) as time_stop
 FROM rdb$database

 UNION ALL
-- рекурсивная часть. Выборка последующих 15-тиминутных интервалов до достижения текущего момента времени.
 SELECT dateadd(Second,1,time_stop) as time_start, dateadd(Minute,15,time_stop) as time_stop
 FROM temp
 WHERE time_stop<CURRENT_TIMESTAMP
)
-- собственно выборка данных и действия над ними, используя границы временного интервала
SELECT
   CAST(t.time_stop AS TIMESTAMP) DTS,
   CAST(coalesce(sum(IIF(s.Accept=0,1,0)),0) as integer) AS DISCARD,
   CAST(coalesce(sum(IIF(s.Accept=1,1,0)),0) as integer) AS ACCEPT
FROM temp t
join Tds_Sessions S on (s.Dts between t.time_start and t.time_stop)
group by t.time_stop


Потом в генераторе отчетов количество переводится в скорость и рисуются графики.
Поправьте меня, если есть более оптимальное решение.

Вопрос чисто академический. Ибо практически оно работает, и не напрягает, и устраивает.

--
"И это пройдет"
12 фев 19, 10:05    [21807085]     Ответить | Цитировать Сообщить модератору
 Re: Решил поиграться с WITH RECURSIVE  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 10024
o_v_a,

хранимая процедура для генерации интервалов была бы чуть более эффективна и универсальна, а так всё нормально
12 фев 19, 10:25    [21807105]     Ответить | Цитировать Сообщить модератору
 Re: Решил поиграться с WITH RECURSIVE  [new]
o_v_a
Member

Откуда: Тула
Сообщений: 1071
Симонов Денис,
Ага, в execute block ради интереса параметризованный всё это засунул и попробовал (для 7 дней и 15 минут в примере, чтоб менять их при необходимости). Может, и пригодится :)
Просто интервалы потому и фиксированные, что для текущей аналитики нам они нормальные такие и я не планировал их как-то часто менять.
Но получилось и с PSQL
12 фев 19, 10:47    [21807133]     Ответить | Цитировать Сообщить модератору
Все форумы / Firebird, InterBase Ответить