Я хотел бы найти время, прошедшее между последовательными (в соответствии с полем даты) записями в таблице журнала...
Например,
Это записи журнала для процессов, которые я запускаю каждый день. Я хочу сделать отчет с различными полями, такими как дата начала и окончания, прошедшие минуты и т. д., но чтобы упростить «ядро» моей проблемы, я думаю, мне нужно выяснить, как получить эти начальные и конечные записи (отмеченные поле комментария) в одну строку, которая будет представлять 1 запуск процесса. Я пробовал сводную таблицу, но не смог заставить ее работать, так как не мог использовать «Упорядочить по дате» со сводной таблицей, что, я думаю, мне нужно, чтобы агрегат «Макс.» был полезен. . Я пробовал группировать... Я почти заставил его работать с самообъединением, используя "Row_Number()" и присоединение Row_Number() к RowNumber+1 (поскольку время каждого запуска отключено на 1 строку по сравнению с последним запуском. .)
но потом я нашел несколько записей, где это было не так. Я предполагаю, что эта основная задача выполнялась много раз, но я еще не нашел своего решения.
Как я могу просто взять каждый запуск процесса (определяемый «началом» и, предположительно, ближайшей датой «окончания») и объединить их в одну строку, чтобы я мог выполнять дальнейшие агрегаты?
Я не могу пометить свою базу данных, поскольку она не общедоступна. Но я бы подумал, что начало и конец следуют показанному шаблону (начало, затем конец), но я думаю, что мое решение путем присоединения к RowNumber() и RowNumber()+1 сработало бы. Но я видел некоторые редкие случаи, когда даты начала были последовательными (без даты окончания между ними) ... Я полагаю, что если в моих процессах есть ошибки, даты окончания не всегда будут регистрироваться ...?
Ваша база данных является частной? Вы имеете в виду, что используете полностью настраиваемую СУБД? Это необычно. Большинство людей используют что-то вроде SQL Server, mySQL, Oracle, одного из них. Вот что Гордон имел в виду под «пометить вашу базу данных». Вам не нужно раскрывать не относящиеся к делу подробности обо всех ваших таблицах и данных, но вы должны сообщить нам, какой продукт вы используете. Синтаксис и функции, доступные для ответа, могут различаться у разных поставщиков.
Уфф, ладно. Это SQL (T-SQL). Позвольте мне выяснить, как пометить SQL. Извините, я думал, что сделал это!
Если «следующая» запись всегда является конечной записью, вы можете сделать:
select t.*
from (select t.*,
lead(log_date) over (order by log_date) as end_log_date
from t
) t
where comment = 'Start tf_crediting : FULL';
Если вам нужна следующая дата окончания, то совокупный условный минимум делает то, что вы хотите:
select t.*
from (select t.*,
min(case when comment = 'end Crediting' then log_date end) over (order by log_date desc) as end_log_date
from t
) t
where comment = 'Start tf_crediting : FULL';
Кажется, это работает, спасибо! ...Мне нужно еще немного изучить этот синтаксис с "Over". Я использовал его только с RowNumber() и разделом, но я не знаю, действительно ли я понял использование самого «over». Это может помочь мне и с другими проблемами :)
Отметьте свой вопрос с помощью базы данных, которую вы используете. Кроме того, всегда ли вы знаете, что значения чередуются?