Я хочу дедуплицировать записи, отбрасывая записи, которые произошли слишком близко к их предыдущему экземпляру (где близость определяется как функция меток времени).
Например, актер 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). Спасибо.