Рекурсивный запрос CTE sql для вычисления скользящих возвратов

#sql #common-table-expression #recursive-query #netezza #recursive-cte

#sql #общее табличное выражение #рекурсивный запрос #netezza #рекурсивный-cte

Вопрос:

Я впервые пишу рекурсивный CTE в SQL для вычисления скользящих возвратов. Формула: 100* (1 возвращает) для первого значения, а затем (RollingReturns)* (1 возвращает)

Таблица выглядит следующим образом:

  ---- -------- -------- ---------------- 
| ID |  Date  | Return | RollingReturns |
 ---- -------- -------- ---------------- 
|  1 | 1/1/20 | 0.50%  |          100.5 |
|  1 | 1/2/20 | 1.00%  |         101.51 |
|  1 | 1/3/20 | -0.7%  |         100.74 |
|  1 | 1/4/20 | 0.50%  |         101.25 |
 ---- -------- -------- ---------------- 
  

Моя попытка написать SQL-запрос:

     WITH rn_cte AS (
        SELECT ROW_NUMBER() OVER (ORDER BY DATE ASC) AS RN, DATE 
        FROM TABLE WHERE ID = 1
        ORDER BY RN 
    )
    rr_cte
    AS
    (
        SELECT RN,P.DATE,RETURNS,RETURNS AS ROLLINGRETURNS
        FROM TABLE P 
        JOIN rn_cte ON rn_cte.DATE = p.DATE 
        WHERE P.ID = 1 AND RN = 1
        UNION ALL
        SELECT RN,pm.DATE,pm.RETURNS,(rr_cte.ROLLINGRETURNS)*(1 pm.RETURNS) AS ROLLINGRETURNS
        FROM TABLE pm WHERE pm.ID = 1
        JOIN rr_cte ON rr_cte.RN = pm.RN 1
        ORDER BY pm.DATE ASC 
    )
    SELECT *
    FROM rr_cte 
  

Это выдает мне ошибку, не уверен, что в ней не так.

 Error                                                                     

    ^found "RR_CTE" (at char 145) expecting `SELECT' or `'(''
  

Любая помощь приветствуется.
Заранее спасибо!

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

1. Пометьте свой вопрос базой данных, которую вы используете. Кроме того, в чем ошибка?

2. . Вопрос не был помечен как Netezza, когда я отвечал на него. Netezza, насколько я знаю, не поддерживает рекурсивные CTE.

3. Это отстой! Спасибо за вашу помощь. Я постараюсь сделать это каким-либо другим возможным способом

Ответ №1:

Вы хотите что-то вроде этого:

 WITH rn AS (
      SELECT ROW_NUMBER() OVER (PARTITION BY id ORDER BY DATE ASC) AS RN, t.* 
      FROM TABLE t
      WHERE ID = 1
     ),
     cte AS (
      SELECT rn.rn, rn.id, rn.date, return,
             100 * (1   rn.return) as rollingreturn
      FROM rn
      UNION ALL
      SELECT rn.rn, rn.id, rn.date, rn.return,
             cte.rollingreturn * (1   rn.return)
      FROM cte JOIN
           rn
           ON cte.id = rn.id AND rn.rn = cte.rn   1
     )
SELECT *
FROM cte;
  

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

1. Спасибо за быстрый ответ. Я вижу, что вы ссылаетесь на cte напрямую. Теперь я все еще получаю сообщение об ошибке: отношение не существует db.admin.cte