#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