Сброс накопленной суммы (без предварительного знания точек сброса) в SQL - PullRequest
0 голосов
/ 13 октября 2019

Я хочу дедуплицировать записи, отбрасывая записи, которые произошли слишком близко к их предыдущему экземпляру (где близость определяется как функция меток времени).

Например, актер 1 совершает действие 1 в моменты времени 1, 7 и 15. (с разницей во времени 6 и 8). Если мое пороговое значение для включения> 10 с с момента последнего экземпляра, вы можете предложить решение, подобное Сброс накопленной суммы? , где time_differential> 10 занимает место OOS в ссылке.

Однако я бы предпочел решение, которое отбрасывает только второй экземпляр, поскольку третий случай возникает через 14 секунд после первого. Это требует кумулятивной суммы различий с перезагрузками в априори неизвестное время.

Я настроил скрипку здесь: http://sqlfiddle.com/#!17/11760/2/0 w / schema

CREATE TABLE timed_action (
    pk INT,
    actor_id INT,
    action_id INT,
    time INT,
    show INT,
    time_since_show INT
);

pk используется только для идентификации. actor_id, action_id и time используются, как я объяснил выше. show и time_since_show - это вручную рассчитанный ответ на проблему, и их не следует использовать. ПК 1-3 демонстрируют пример сверху. Единственный другой набор примеров, который не может быть решен простым использованием time - LAG(time, 1) ... в окне DQL, это pk 14-17, где pk 15 и 16 отбрасываются, а pk 17 отображается, несмотря на то, что он произошел только через 3 с после pk 16.

Я наполовину убежден, что это невозможно в SQL без использования какого-либо языкового расширения, такого как PL / pgSQL, или с использованием рекурсии, для меня это не вариант - яиспользуя аналитическую базу данных компании (например, Amazon EMR), к которой я не могу добавить языковые функции. Этот вопрос - мой привет Мэри, прежде чем просто сгруппировать (timestamp / 10). Спасибо.

...