как обновить строки по диапазону дат в teradata

У меня есть две таблицы в базе данных teradata, которые выглядят так

accounts
account_number integer
date_updated_last datetime
delinquency_code varchar(3)

payments
account_number integer
statement_date datetime
delinquency_code varchar(3)

столбец кода просрочки заполняется в учетных записях, но не заполняется в платежах. Я хотел бы обновить платежи с кодом просрочки на основе date_updated_last и statement_date. проблема в том, что statement_date является последовательным, скажем, данная учетная запись была открыта в июле 2009 года, будет одна запись для каждого месяца между тем и настоящим, но запись учетной записи добавляется только при изменении информации, поэтому может быть, для например, только 3 записи в таблице учетных записей для одной и той же учетной записи. Скажем, август 2009 г., январь 2010 г. и март 2010 г., поэтому я хотел бы обновить все платежные записи с августа 2009 г. по январь 2010 г. данными из записи августа 2009 г. в учетных записях. может ли кто-нибудь указать мне простой способ сделать это?

благодарю вас :)

-C


person Chris Drappier    schedule 28.06.2010    source источник


Ответы (1)


Хорошо, вот еще одна попытка синтаксиса Teradata:

UPDATE
    Payments
FROM
    (
        SELECT
            A1.account_number,
            A1.date_updated_last AS begin_date,
            A2.date_updated_last AS end_date,
            A1.delinquency_code
        FROM
            Accounts A1
        INNER JOIN Accounts A2 ON
            A2.account_number = A1.account_number AND
            A2.date_updated_last > A1.date_updated_last
        WHERE
            NOT EXISTS
            (
                SELECT *
                FROM
                    Accounts A3
                WHERE
                    A3.account_number = A1.account_number AND
                    A3.date_updated_last > A1.date_updated_last AND
                    A3.date_updated_last < A2.date_updated_last
            )
    ) AS SQ (account_number, begin_date, end_date, delinquency_code)
SET
    delinquency_code = SQ.delinquency_code
WHERE
    account_number = SQ.account_number AND
    statement_date >= SQ.begin_date AND
    statement_date < SQ.end_date
person Tom H    schedule 28.06.2010
comment
что такое A в операторе set? - person Chris Drappier; 28.06.2010
comment
Извините, исправил это. Я начал с A в качестве псевдонима таблицы, затем изменил его, не меняя в части SET. - person Tom H; 28.06.2010
comment
на самом деле, я говорил слишком рано. Сначала я попробовал это как выбор, чтобы убедиться, что значения выровнены, и они это сделали, но обновление выдает ошибку: объединенные таблицы не разрешены в предложении from. кроме того, оператор set должен стоять прямо перед оператором where. - person Chris Drappier; 28.06.2010
comment
Тьфу... какой паршивый перевод (?) SQL. Похоже, вы застряли, используя подзапросы (что было бы беспорядок) или используя внешнее приложение, чтобы сделать преобразование для вас. Я мог бы написать коррелированный метод подзапроса, но я не могу представить, что производительность будет приемлемой. Я постараюсь добавить это в свой ответ на всякий случай. - person Tom H; 28.06.2010
comment
Хорошо, я только что проверил документы Teradata, и похоже, что это может быть синтаксис, а не фактическая функциональность. Я попытаюсь исправить свое исходное утверждение для синтаксиса Teradata. - person Tom H; 28.06.2010