Отслеживайте разницу во времени бега в отдельном столбце - PullRequest
0 голосов
/ 29 октября 2019

У меня есть база данных, которая принимает отчеты журнала от нескольких клиентов (компьютеров). Каждая строка содержит имя клиента, некоторые данные и столбец отметки времени со временем, когда журнал поступил в БД.

Я хочу рассчитать (в ретроспективе, для дальнейшего анализа) разницу во времени выполнения между двумяпоследние времена и сохраните это в столбце "time-diff". Затем это переводится как «продолжительность» этой записи журнала.

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

Пожалуйстаобратите внимание, что в таблице с журналами есть записи cca 1M .

Я могу сделать это "select", используя код ниже. Я борюсь с тем, чтобы сохранить разницу в правильном ряду. (timestamp_diff(a, b) -> a - b является моей пользовательской функцией, проверено, возвращает разницу в секундах).

До сих пор я тестировал выбор только на 2 компьютерах, их более 100.

select computername,
       datetime,
       timestamp_diff(datetime, lag(datetime) over (partition by computername order by datetime))
from table_with_logs
where computername in ('AAAA', 'BBBB')

Таблица должна выглядеть примерно так:

COMPUTERNAME    DATETIME                            TASK         DIFFERENCE
-------------------------------------------------------------------------
AAAA            25.09.19 13:51:26,000000000 +02:00  IDLE         121
AAAA            25.09.19 13:53:27,000000000 +02:00  COMPUTING    121
AAAA            25.09.19 13:55:27,000000000 +02:00  IDLE         120
AAAA            25.09.19 13:57:28,000000000 +02:00  COMPUTING    121
AAAA            25.09.19 13:59:29,000000000 +02:00  OFFLINE      121

Я в основном ищу правильное выражение UPDATE.

В псевдокоде python это будет выглядеть примерно так:

for row in table:
    previousRow.diff = row.time - previousRow.time

Все это так, чтобы я мог легко сделать:

SELECT computername, task, SUM(DIFFERENCE)
FROM table_with_logs
GROUP BY computername, task

Заранее большое спасибо за вашу помощь.

Ответы [ 2 ]

0 голосов
/ 30 октября 2019

Нестандартное мышление

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

CREATE TABLE MY_TABLE_UPDATED
AS
(select timestamp_diff(datetime, lag(datetime) over (partition by computername order 
 by datetime)) as diff, 
 MY_TABLE.*
 from MY_TABLE)

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

Надеюсь, это поможет кому-нибудь в будущем.

0 голосов
/ 29 октября 2019

Зачем вам нужен update? Почему бы просто не выполнить такой запрос?

select computername, task, sum(difference)
from (select l.*,
             timestamp_diff(datetime, lag(datetime) over (partition by computername order by datetime))
      from table_with_logs l
     ) l
where computername in ('AAAA', 'BBBB')
group by computername, task;

Я не вижу преимущества в изменении модели данных.

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