SQL выделяет кредит с перекрытием даты и времени - PullRequest
0 голосов
/ 29 июня 2018

Я работаю над системой обнаружения ботов, которая помогает мне запускать ML для идентификации этого трафика.

Короче говоря, у меня есть две таблицы:

  1. Одна таблица содержит все данные журнала сервера (запросы на второй уровень) со столбцом даты и времени
  2. Одна таблица, в которой есть строка для исключительного события, которое я определил. (со столбцом даты и времени)

Итак, у меня есть две таблицы, и я хочу объединить их и суммировать столбец запроса сервера. Это становится сложно, так как исключения могут перекрываться.

Давайте представим, что у нас есть таблица Исключения :

Name       | Datetime          | LengthInMin
ExceptionA   01-01-18 08:00:00   5
ExceptionB   01-01-18 08:02:00   5

А стол Журнал :

Datetime           | Requests
01-01-18 08:00:01    50
01-01-18 08:00:03    100
01-01-18 08:00:04    350
01-01-18 08:00:06    100

В простом случае Исключение А может иметь все запросы к себе. simple

В более сложном случае кредит может делиться несколькими исключениями: overlap

Как мне сделать это в SQL? Я не совсем уверен, с чего начать.

1 Ответ

0 голосов
/ 29 июня 2018

Я думаю, что будет очень сложно разделить количество запросов между несколькими перекрывающимися событиями исключений. Особенно если учесть, что нет способа точно приписать запись в журнале к правильному событию исключения при множественном перекрытии.

С учетом вышесказанного, если значение credit просто будет использоваться в качестве меры, с помощью которой можно определить наиболее важные проблемы, которые необходимо исправить, то я на самом деле не думаю, что это необходимо. Вместо этого, если вы просто приписываете всю сумму в равной степени каждому перекрывающемуся событию, показатели будут по-прежнему репрезентативными.

Например, взять ваш пример:

Exception A        (450 / 2) + 50  = 275
Exception B        (450 / 2) + 100 = 325

// Difference 50 requests

Принимая во внимание, что если вы назначите сумму обоим событиям исключения:

Exception A        450 + 50  = 500
Exception B        450 + 100 = 550

// Difference 50 requests

Если вы хотите пройти этот маршрут, вы можете использовать следующий запрос:

SELECT e.*, SUM(l.requests) AS credit
FROM exceptions e
INNER JOIN logs l 
    ON l.date BETWEEN e.date AND DATE_ADD(e.date, INTERVAL e.duration MINUTE)
GROUP BY e.id;

http://sqlfiddle.com/#!9/67dfc8/1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...