Как реализовать сброс, когда (Teradata) только с использованием ANSI SQL?

введите описание изображения здесь
Мне нужно написать запрос, который считает число часто транзакции клиентов превышают 250 фунтов стерлингов. Кумулятивное сложение до тех пор, пока сумма не превысит 250, затем сбрасывается и начинается со следующей строки, пока она не превысит 250 и так далее. Эта функция может быть реализована с использованием ключевых слов Teradata «RESET WHEN», но я должен создать запрос, состоящий только из ANSI SQL SYNTAX. Кто-нибудь может с этим помочь?

 SUM(sales) OVER (
            PARTITION BY region
            ORDER BY day_of_calendar
            RESET WHEN sales < /* preceding row */ SUM(sales) OVER (
                 PARTITION BY region
                 ORDER BY day_of_calendar
                 ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING)
            ROWS UNBOUNDED PRECEDING
       )

1: https://i.stack.imgur.com/lu4Jp.png Это образец ввода клиента введите здесь описание изображения И вот результат. Каждый раз, когда общая сумма расходов клиента превышает 250, я должен снова суммировать от 0 и найти день, в который клиент превысил 250 долларов США.


person Mohammed Elhamamsy    schedule 16.12.2020    source источник
comment
Можете ли вы предоставить образцы данных и ожидаемый результат?   -  person Marmite Bomber    schedule 16.12.2020
comment
Проверьте stackoverflow.com/a/53344956/2527905 Но это может не сработать, тогда вам нужна рекурсия. Можете ли вы показать примеры данных и ожидаемый результат? Если ваш   -  person dnoeth    schedule 16.12.2020
comment
Я обновил сообщение, указав ввод и ожидаемый результат. Последнее имя столбца вывода должно быть передано_250 (чтобы вас не запутать).   -  person Mohammed Elhamamsy    schedule 16.12.2020
comment
Хорошо, единственный способ получить ожидаемый результат - это рекурсивный запрос. У меня нет времени писать, но примеры должны быть   -  person dnoeth    schedule 16.12.2020
comment
Хорошо, спасибо за ответ.   -  person Mohammed Elhamamsy    schedule 16.12.2020
comment
Пожалуйста, предоставьте образцы данных в виде исполняемого оператора вместо изображения, это увеличит ваши шансы на то, что кто-то попытается вам помочь. Я думаю, что это можно решить с помощью предложения match_recognise - оно делает именно это.   -  person Koen Lostrie    schedule 18.12.2020


Ответы (1)


Без определений таблиц и только снимка экрана с очень ограниченным набором данных сложно проверить мой ответ на ваших данных, поэтому я сначала показываю его на наборе данных, предоставленном в match_recognize учебник по живому SQL, а затем с вашими столбцами:

SELECT
  *
  FROM
  ticker MATCH_RECOGNIZE (
    PARTITION BY symbol
    ORDER BY tstamp
    MEASURES
      nvl(SUM(up.price),0) AS tot
    ALL ROWS PER MATCH
  PATTERN ( up* ) DEFINE
    up AS SUM(up.price) - up.price <= 100
  );

Итак, на вашем столе это будет что-то вроде

SELECT
  *
  FROM
  your_table MATCH_RECOGNIZE (
    PARTITION BY region
    ORDER BY day_of_calendar
    MEASURES
      nvl(SUM(up.sales),0) AS tot
    ALL ROWS PER MATCH
  PATTERN ( up* ) DEFINE
    up AS SUM(up.sales) - up.sales <= 250
  );
person Koen Lostrie    schedule 18.12.2020