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

Откуда: Харків
Сообщений: 1233
Есть ЦТЕ-шка (упрощено)
;WITH CTE AS
(
 SELECT
   ROW_NUMBER() OVER (ORDER BY newSessionId, ClientTime, m.[Date]) Num, 
   m.[Date], 
   newSessionId AS SessionId, 
   ClientTime
FROM 
  ActionsLog m
WHERE 
  ActionId IN (15,16,17,20) 
)
Нужен запрос типа:
SELECT 
  a.[Date], 
  DATEDIFF(ss, b.ClientTime, a.ClientTime)
FROM 
  CTE a
    INNER JOIN 
    (SELECT 
      SessionID,
      Num,
      CASE WHEN ActionId = 17 
           THEN ClientTime
           ELSE (SELECT MAX(c.ClientTime) FROM CTE c WHERE c.ActionId = 17 AND c.Num < Num)
      END ClientTime     
    FROM
      CTE 
    WHERE ActionId IN (15,17)) b 
    
    ON a.SessionID = b.SessionID AND a.Num = b.Num + 1
WHERE 
  a.ActionId = 15
Помогите правильно нарисовать рекурсию, чтоб побыстрей шагало.
Вот такой вариант тоже шуршит медленно:

SELECT 
  a.[Date], 
  DATEDIFF(ss, CASE WHEN d.ClientTime IS NOT NULL 
                    THEN d.ClientTime
                    WHEN c.ClientTime IS NOT NULL 
                    THEN c.ClientTime
                    ELSE b.ClientTime
               END, a.ClientTime)
FROM 
  CTE a
    INNER JOIN CTE b  ON b.ActionId IN (15,17) AND a.SessionID = b.SessionID AND a.Num = b.Num + 1
    LEFT JOIN CTE c  ON c.ActionId IN (15,17) AND b.SessionID = c.SessionID AND b.Num = c.Num + 1
    LEFT JOIN CTE d  ON d.ActionId IN (17) AND c.SessionID = d.SessionID AND c.Num = d.Num + 1
WHERE 
  a.ActionId = 15
Хотя возможно вложенность может быть и больше трёх. Но точно не больше десяти.
25 июл 11, 17:59    [11024639]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плиз с рекурсией  [new]
stimpi
Member

Откуда: Киев, Украина
Сообщений: 662
тестовые данные и что на выходе приведите
25 июл 11, 18:36    [11024836]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плиз с рекурсией  [new]
igor2222
Member

Откуда: Харків
Сообщений: 1233
Табличка 10 млн. строк.
Если есть последовательность :
1	17
2	15
3	15
4	20
5	15
6	16
7	17
8	15
9	20
10	17
То считаем и выводим:
Разницу между 2 и 1
Разницу между 3 и 1
Разницу между 8 и 7
Последовательность из подряд идущих 15 может быть до 10 штук.
25 июл 11, 18:56    [11024952]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плиз с рекурсией  [new]
igor2222
Member

Откуда: Харків
Сообщений: 1233
Вопрос снят. Засунул в темповую таблицу, проиндексировал и прицепил NOT EXISTS для вхождений 16 и 20. Скорость устраивает. Всем спасибо.
25 июл 11, 19:43    [11025166]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить