Стандарт SQL: Сброс суммы в зависимости от результата - PullRequest
1 голос
/ 22 апреля 2020

Использование стандартного SQL в Google Big Query. Я пытаюсь вычислить промежуточную сумму баланса, который никогда не может быть отрицательным.

На картинке вот моя проблема. У меня есть строки и ввода - я пытаюсь получить желаемый вывод для каждой строки.

enter image description here

Правило состоит в том, что мне нужно промежуточный итог ввода - но если входной сигнал становится отрицательным, тогда он должен эффективно сбросить входные данные с этой точки и далее.

Я попытался вставить некоторые маркеры сброса для разделения по этим негативам, но тогда у меня возникла бы проблема, при которой я не мог не пройти повторяющиеся негативы, если они не положили общий счет в минус. (Это будет сброшено снова на -2 на картинке).

Я чувствую, что я действительно тупой здесь. Любая помощь будет оценена.

Спасибо

1 Ответ

1 голос
/ 23 апреля 2020

Как говорит Гордон в комментариях, без сценария это невозможно.
Таким образом, вы можете найти сценарий здесь:

DECLARE update_index INT64 DEFAULT 0;

CREATE TEMP TABLE t1 AS
SELECT index, input, 0 as reset, 0 as reset_group, SUM(input) OVER (ORDER BY index) AS cumsum
FROM UNNEST([4,1,1,-12,1,3,-2,1 ]) AS input WITH OFFSET index;

LOOP
SET update_index = (SELECT MIN(index) FROM t1 WHERE cumsum < 0);
IF update_index IS NULL 
THEN 
  LEAVE; 
END IF;

UPDATE t1
SET reset = 1
WHERE index = update_index;

CREATE OR REPLACE TEMP TABLE t1 AS
SELECT *, SUM(IF(reset = 1, 0, input)) OVER (PARTITION BY reset_group ORDER BY index) AS cumsum
FROM (
  SELECT index, input, reset, SUM(reset) OVER (ORDER BY index) as reset_group
  FROM t1
);

END LOOP;

SELECT *
FROM t1
ORDER BY index;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...