У меня есть набор данных, аналогичный приведенному ниже образцу:
RecordId RecordDateTime AttributeA AttributeB Amount Value
--------- ------------------- ----------- ----------- ------ -------
1 2020-08-01 00:00:00 AttA01 AttB01 10.00 6510
2 2020-08-01 00:00:00 AttA01 AttB01 11.00 3620
3 2020-08-01 00:07:00 AttA01 AttB01 17.00 87430
4 2020-08-01 00:15:00 AttA01 AttB01 15.00 4140
5 2020-08-01 00:20:00 AttA02 AttB01 30.00 2350
6 2020-08-01 00:30:00 AttA01 AttB01 20.00 14560
7 2020-08-01 00:46:00 AttA01 AttB01 15.00 1370
8 2020-08-01 02:15:00 AttA01 AttB01 30.00 1380
9 2020-08-01 02:30:00 AttA01 AttB01 5.00 4490
10 2020-08-01 02:30:00 AttA01 AttB01 6.00 13100
Мне нужно сгруппировать все записи, в которых AttributeA и AttributeB совпадают, а время записи RecordDateTime для следующей записи находится в пределах 15 минут от значения RecordDateTime текущей записи.
Результаты должны показывать самую раннюю дату группы, AttributeA и AttributeB, сумму Amount и самой ранней записи в значении группы как StartValue и значение последней записи как EndValue.
Пример результатов:
RecordDateTime AttributeA AttributeB Amount StartValue EndValue
------------------- ----------- ----------- ------ ---------- ----------
2020-08-01 00:00:00 AttA01 AttB01 73.00 3620 14560
2020-08-01 00:20:00 AttA02 AttB01 30.00 2350 2350
2020-08-01 00:46:00 AttA01 AttB01 15.00 1370 1370
2020-08-01 02:15:00 AttA01 AttB01 41.00 1380 13100
Я борюсь с рекурсивной группировкой, основанной на разнице во времени в 15 минут. Я пробовал несколько вещей, в том числе рекурсивный CTE, но на самом деле не добился никакого прогресса, который стоило бы показать. Есть ли простое решение для группировки?
Изменить: предоставление дополнительных сведений по запросу. Для приложения всегда будет начало и конец даты, которые пользователь может динамически выбирать, что может охватывать несколько месяцев, начиная с любого дня или времени.
Предоставленные данные являются производственными данными. В реальной жизни AttributeA будет именем человека, а AttributeB — местоположением, а записи — транзакциями.
Любая серия транзакций, совершенных одним и тем же лицом в одном и том же месте с задержкой от 0 до 15 минут (›= 0 и ‹= 15) между каждой транзакцией, должна быть сгруппирована, суммирована и рассмотрена как одна транзакция. Другими словами, если транзакция находится в пределах 15 минут от предыдущей транзакции, она должна быть сгруппирована с предыдущими транзакциями и любой другой предшествующей транзакцией, с которой сгруппирована предыдущая транзакция.
На данный момент меня не интересуют какие-либо транзакции, которые могли произойти до или после выбранной даты и времени начала и окончания, даже если они могут стать частью ряда в выбранном диапазоне дат.
FIRST_VALUE()
и добавилEndValue
, которую я почему-то пропустил в первый раз. 26.08.2020