Я собираюсь провести вас через это концептуально.Прежде всего, в этом есть сложность, которую вы, возможно, не заметили.
Допустим, вы хотели одну запись за один час или день.Но если две записи созданы в один и тот же день, вам нужна только одна запись в ваших результатах.Какой из них?
Я упоминаю об этом, потому что разработчикам SQL нет единого ответа, который они могут предоставить для выбора.Затем невозможно отобразить данные из обеих записей без того, чтобы обе записи находились в табличном выводе.
Это распространенная проблема, но когда разработчики SQL предоставили функцию для ее обработки, она может работать только при отсутствии двусмысленностио том, как иметь один ряд результата для двух записей.Это решение GROUP BY
, но оно работает только для отображения полей, отличных от отметки времени, если они одинаковы для всех записей, соответствующих периоду времени.Вы должны включить все поля в предложение select, и если несколько записей в вашем периоде времени одинаковы, они создадут несколько записей в вашем выводе.Поэтому, хотя для этой проблемы есть инструмент GROUP BY
, вы не сможете его использовать.
Так что вот решение, которое вы хотите.Если несколько записей расположены близко друг к другу, не включайте записи после первой.Таким образом, вы хотите предложение WHERE
, которое исключит запись, если другая запись недавно обработает ее.Таким образом, проверка для каждой записи в результате будет включать других записей в таблице.Вам необходимо присоединить таблицу к самой .
Допустим, у нас есть таблица с именем error_events
.Если мы получим кратные значения одного и того же значения в поле error_type
очень близко ко времени других похожих событий, мы хотим видеть только первое.SQL будет выглядеть примерно так:
SELECT A.*
FROM error_events A
INNER JOIN error_events B ON A.error_type = B.error_type
WHERE ???
Вам нужно будет выяснить детали предложения WHERE
, и функции для метки времени будут зависеть от вас, когда вы используете продукт RDBMS.(Например, mysql и postgres могут работать по-разному.)
Вам нужны только те записи, в которых нет записи, которая раньше, чем на 15 минут.Вы действительно хотите оригинальную запись.Эта запись будет соответствовать сама по себе в соединении, но это будет единственная запись за период между ее отметкой времени и 15 минутами ранее.
Таким образом, пример WHERE
предложения будет
WHERE B.create_dt BETWEEN [15 minutes before A.create_dt] and A.create_dt
GROUP BY A.*
HAVING 1 = COUNT(B.pkey)
Как мы уже говорили, вам нужно выяснить, как ваш продукт баз данных вычитает время и как 15 минут представлены в этой разнице.