Вы можете использовать рекурсивный CTE для генерации 5-минутных интервалов даты и времени для каждого проекта, затем объединить свои меры с этими интервалами и получить минимальный показатель (на CR_DATE
) в каждой группе.
В следующейНапример, я предполагаю, что sr_no
- это PRIMARY KEY
(или UNIQUE
), а также INT
и IDENTITY
или число, которое всегда увеличивается.Я также игнорирую все остальные столбцы из таблицы, так как они не важны для этой конкретной проблемы (вы можете выбрать, какой вам нужен в конечном итоге SELECT
).
Пример данных:
IF OBJECT_ID('tempdb..#Measures') IS NOT NULL
DROP TABLE #Measures
CREATE TABLE #Measures (
sr_no INT IDENTITY,
PROJECT_ID VARCHAR(100),
CR_DATE DATETIME)
INSERT INTO #Measures (
PROJECT_ID,
CR_DATE)
VALUES
('A', '2018-01-01 00:02:26.112'),
('A', '2018-01-01 00:03:26.112'),
('A', '2018-01-01 00:07:26.014'),
('A', '2018-01-01 00:12:26.112'),
('A', '2018-01-01 00:23:43.112'),
('A', '2018-01-01 00:26:26.112'),
('B', '2018-11-26 00:01:26.112'),
('B', '2018-11-25 23:59:00.000'),
('B', '2018-11-26 05:02:26.112')
Предлагаемое решение:
DECLARE @IntervalMinutes INT = 5
;WITH MaxDateMeasuresByProject AS
(
SELECT
PROJECT_ID = M.PROJECT_ID,
MaxCR_DATE = MAX(M.CR_DATE)
FROM
#Measures AS M
GROUP BY
M.PROJECT_ID
),
RecursiveIntervals AS
(
-- Anchor (minimum CR_DATE by PROJECT_ID)
SELECT
PROJECT_ID = M.PROJECT_ID,
IntervalStart = MIN(M.CR_DATE),
IntervalEnd = DATEADD(MINUTE, @IntervalMinutes, MIN(M.CR_DATE)),
RecursiveLevel = 1
FROM
#Measures AS M
GROUP BY
M.PROJECT_ID
UNION ALL
-- Recursion (minutes added to each project interval, until max available measure)
SELECT
PROJECT_ID = R.PROJECT_ID,
IntervalStart = R.IntervalEnd,
IntervalEnd = DATEADD(MINUTE, @IntervalMinutes, R.IntervalEnd),
RecursiveLevel = R.RecursiveLevel + 1
FROM
RecursiveIntervals AS R
INNER JOIN MaxDateMeasuresByProject AS M ON R.PROJECT_ID = M.PROJECT_ID
WHERE
R.IntervalEnd <= M.MaxCR_DATE
),
FirstMeasureByIntervalByProject AS
(
SELECT
PROJECT_ID = M.PROJECT_ID,
RecursiveLevel = R.RecursiveLevel,
FirstMeasureSR_NO = MIN(M.sr_no)
FROM
#Measures AS M
INNER JOIN RecursiveIntervals AS R ON
M.PROJECT_ID = R.PROJECT_ID AND
M.CR_DATE >= R.IntervalStart AND
M.CR_DATE < R.IntervalEnd
GROUP BY
M.PROJECT_ID,
R.RecursiveLevel
)
SELECT
M.*
FROM
FirstMeasureByIntervalByProject AS F
INNER JOIN #Measures AS M ON F.FirstMeasureSR_NO = M.sr_no
ORDER BY
M.PROJECT_ID,
M.CR_DATE
OPTION
(MAXRECURSION 0)
Результат от промежуточного шага RecursiveIntervals
подобен следующему (5-минутные интервалы для каждого проекта между минимальными и максимальными мерами):
PROJECT_ID IntervalStart IntervalEnd RecursiveLevel
A 2018-01-01 00:02:26.113 2018-01-01 00:07:26.113 1
A 2018-01-01 00:07:26.113 2018-01-01 00:12:26.113 2
A 2018-01-01 00:12:26.113 2018-01-01 00:17:26.113 3
A 2018-01-01 00:17:26.113 2018-01-01 00:22:26.113 4
A 2018-01-01 00:22:26.113 2018-01-01 00:27:26.113 5
B 2018-11-25 23:59:00.000 2018-11-26 00:04:00.000 1
B 2018-11-26 00:04:00.000 2018-11-26 00:09:00.000 2
B 2018-11-26 00:09:00.000 2018-11-26 00:14:00.000 3
B 2018-11-26 00:14:00.000 2018-11-26 00:19:00.000 4
B 2018-11-26 00:19:00.000 2018-11-26 00:24:00.000 5
B 2018-11-26 00:24:00.000 2018-11-26 00:29:00.000 6
B 2018-11-26 00:29:00.000 2018-11-26 00:34:00.000 7
B 2018-11-26 00:34:00.000 2018-11-26 00:39:00.000 8
B 2018-11-26 00:39:00.000 2018-11-26 00:44:00.000 9
B 2018-11-26 00:44:00.000 2018-11-26 00:49:00.000 10
B 2018-11-26 00:49:00.000 2018-11-26 00:54:00.000 11
B 2018-11-26 00:54:00.000 2018-11-26 00:59:00.000 12
B 2018-11-26 00:59:00.000 2018-11-26 01:04:00.000 13
B 2018-11-26 01:04:00.000 2018-11-26 01:09:00.000 14
B 2018-11-26 01:09:00.000 2018-11-26 01:14:00.000 15
B 2018-11-26 01:14:00.000 2018-11-26 01:19:00.000 16
B 2018-11-26 01:19:00.000 2018-11-26 01:24:00.000 17
B 2018-11-26 01:24:00.000 2018-11-26 01:29:00.000 18
B 2018-11-26 01:29:00.000 2018-11-26 01:34:00.000 19
B 2018-11-26 01:34:00.000 2018-11-26 01:39:00.000 20
B 2018-11-26 01:39:00.000 2018-11-26 01:44:00.000 21
B 2018-11-26 01:44:00.000 2018-11-26 01:49:00.000 22
B 2018-11-26 01:49:00.000 2018-11-26 01:54:00.000 23
B 2018-11-26 01:54:00.000 2018-11-26 01:59:00.000 24
B 2018-11-26 01:59:00.000 2018-11-26 02:04:00.000 25
B 2018-11-26 02:04:00.000 2018-11-26 02:09:00.000 26
B 2018-11-26 02:09:00.000 2018-11-26 02:14:00.000 27
B 2018-11-26 02:14:00.000 2018-11-26 02:19:00.000 28
B 2018-11-26 02:19:00.000 2018-11-26 02:24:00.000 29
B 2018-11-26 02:24:00.000 2018-11-26 02:29:00.000 30
B 2018-11-26 02:29:00.000 2018-11-26 02:34:00.000 31
B 2018-11-26 02:34:00.000 2018-11-26 02:39:00.000 32
B 2018-11-26 02:39:00.000 2018-11-26 02:44:00.000 33
B 2018-11-26 02:44:00.000 2018-11-26 02:49:00.000 34
B 2018-11-26 02:49:00.000 2018-11-26 02:54:00.000 35
B 2018-11-26 02:54:00.000 2018-11-26 02:59:00.000 36
B 2018-11-26 02:59:00.000 2018-11-26 03:04:00.000 37
B 2018-11-26 03:04:00.000 2018-11-26 03:09:00.000 38
B 2018-11-26 03:09:00.000 2018-11-26 03:14:00.000 39
B 2018-11-26 03:14:00.000 2018-11-26 03:19:00.000 40
B 2018-11-26 03:19:00.000 2018-11-26 03:24:00.000 41
B 2018-11-26 03:24:00.000 2018-11-26 03:29:00.000 42
B 2018-11-26 03:29:00.000 2018-11-26 03:34:00.000 43
B 2018-11-26 03:34:00.000 2018-11-26 03:39:00.000 44
B 2018-11-26 03:39:00.000 2018-11-26 03:44:00.000 45
B 2018-11-26 03:44:00.000 2018-11-26 03:49:00.000 46
B 2018-11-26 03:49:00.000 2018-11-26 03:54:00.000 47
B 2018-11-26 03:54:00.000 2018-11-26 03:59:00.000 48
B 2018-11-26 03:59:00.000 2018-11-26 04:04:00.000 49
B 2018-11-26 04:04:00.000 2018-11-26 04:09:00.000 50
B 2018-11-26 04:09:00.000 2018-11-26 04:14:00.000 51
B 2018-11-26 04:14:00.000 2018-11-26 04:19:00.000 52
B 2018-11-26 04:19:00.000 2018-11-26 04:24:00.000 53
B 2018-11-26 04:24:00.000 2018-11-26 04:29:00.000 54
B 2018-11-26 04:29:00.000 2018-11-26 04:34:00.000 55
B 2018-11-26 04:34:00.000 2018-11-26 04:39:00.000 56
B 2018-11-26 04:39:00.000 2018-11-26 04:44:00.000 57
B 2018-11-26 04:44:00.000 2018-11-26 04:49:00.000 58
B 2018-11-26 04:49:00.000 2018-11-26 04:54:00.000 59
B 2018-11-26 04:54:00.000 2018-11-26 04:59:00.000 60
B 2018-11-26 04:59:00.000 2018-11-26 05:04:00.000 61
И окончательный результат:
sr_no PROJECT_ID CR_DATE
1 A 2018-01-01 00:02:26.113
4 A 2018-01-01 00:12:26.113
5 A 2018-01-01 00:23:43.113
7 B 2018-11-26 00:01:26.113
9 B 2018-11-26 05:02:26.113
Если у вас много записей и очень большие промежутки времени для каждого проекта, этот запрос, скорее всего, займет очень много времени.Сброс данных рекурсивного CTE во временную таблицу в этом случае ускорит процесс.
Вы также можете изменить значение @IntervalMinutes
, чтобы увидеть результаты другого интервала.