Я прошу прощения за то, насколько потенциально загроможденным может быть объяснение моей проблемы. Я включил детали, чтобы как можно больше смысла привело к главному препятствию, с которым я столкнулся.
Я работаю в Teradata, используя две таблицы, которые выглядят следующим образом
Table Name Fields
Sales (ID, Sales)
Discounts (ID, PromoNum, Discount)
Поле PromoNum
состоит из 9 ди git уникальных промо-номеров, соответствующих купонам. Это помогает отследить, когда транзакция включает указанный купон c, который использовался. К каждой транзакции может применяться более 1 купона.
Я пытаюсь создать рекурсивный запрос, который выводит продажи и скидки для заданного набора купонов итеративным способом. Причина, по которой я делаю это итеративно, заключается в том, что к одной транзакции может быть применено более 1 купона (для 1 или более элементов). Если бы я избегал рекурсивного маршрута запроса и выполнял, например, внутреннее объединение на ID
, я мог бы излишне дублировать записи, если в одной транзакции использовались два или более рекламных номера, что приводило к потенциально большим продажам или скидкам, чем актуальный. Кроме того, у меня есть доступ только для чтения к базе данных.
Я создал временную таблицу с именем Promos
с 3 указанными c рекламными акциями, которые я хочу запустить интерактивно, и имеет поля PromoNum
и PromoIndex
. PromoIndex
- это, по сути, номер строки для каждой рекламной акции, которую я пытаюсь использовать в интерактивном порядке ниже.
Рекурсивный запрос, который я написал до сих пор, приведен ниже. Это не работает, как ожидалось, из-за логики, которую я прокомментировал. Мне нужно переписать эту часть, чтобы убедиться, что она просто запускается для номера продвижения, соответствующего индексу на этой указанной итерации c. Например, когда он находится на итерации 2, он будет технически включаться в PromoIndex 1 и PromoIndex 2, когда он должен работать только для PromoIndex 2, если это имеет смысл. Я пытался переписать его, оставаясь в пределах допустимого в рекурсивном запросе, и не могу понять это.
WITH RECURSIVE PromoData AS
(
SELECT
1 AS PromoIndex
, 1 AS PromoNum --dummy column
, 0 AS Sales --dummy column
, 0 AS Discounts --dummy column
FROM
Dummy Table
UNION ALL
SELECT
PromoData.PromoIndex + 1
, PromoData.PromoNum
, Sales.Sales
, Discounts.Discounts --Edited here
FROM Sales
INNER JOIN Discounts on Sales.ID = Discounts.ID
INNER JOIN Promos on Promos.PromoNum = Discounts.PromoNum and Promos.PromoIndex = PromoData.PromoIndex --Problematic portion here
WHERE PromoData.PromoIndex <= 3
)
SELECT *
FROM PromoData