TSQL готовит данные за 15 минут
У меня есть таблица фактов хранилища, содержащая необработанные данные (четные повторяющиеся данные), полученные от поставщика через фид данных. Мне нужно подготовить кусок данных за 15 минут. Как я могу лучше всего запрос SQL Server, чтобы сделать это. EgSample Data
ID key Date Value
1 1 2013-10-08 00:00:00.000 10
2 1 2013-10-08 00:23:00.000 15
3 1 2013-10-08 01:00:00.000 20
4 1 2013-10-08 01:15:00.000 25
5 1 2013-10-08 01:30:00.000 30
6 1 2013-10-08 01:35:00.000 30
7 1 2013-10-08 01:50:00.000 30
8 1 2013-10-08 01:55:00.000 30
2 ответа
Пакетирование в фиксированные партии для каждой четверти часа, путем создания нового столбца, который определяет начало каждой партии:
SELECT
*,
CASE
WHEN (DATEPART(minute, [Date]) >= 0 AND DATEPART(minute, [Date]) < 15) THEN DATETIMEFROMPARTS (DATEPART(year, [Date]), DATEPART(month, [Date]), DATEPART(day, [Date]), DATEPART(hour, [Date]), 0, 0, 0)
WHEN (DATEPART(minute, [Date]) >= 15 AND DATEPART(minute, [Date]) < 30) THEN DATETIMEFROMPARTS (DATEPART(year, [Date]), DATEPART(month, [Date]), DATEPART(day, [Date]), DATEPART(hour, [Date]), 15, 0, 0)
WHEN (DATEPART(minute, [Date]) >= 30 AND DATEPART(minute, [Date]) < 45) THEN DATETIMEFROMPARTS (DATEPART(year, [Date]), DATEPART(month, [Date]), DATEPART(day, [Date]), DATEPART(hour, [Date]), 30, 0, 0)
ELSE DATETIMEFROMPARTS (DATEPART(year, [Date]), DATEPART(month, [Date]), DATEPART(day, [Date]), DATEPART(hour, [Date]), 45, 0, 0)
END AS BatchStart
FROM
Fact
ORDER BY
[Date]
Результат для вашего примера:
ID key Date Value BatchStart
1 1 2013-10-08 00:00:00.000 10 2013-10-08 00:00:00.000
2 1 2013-10-08 00:23:00.000 15 2013-10-08 00:15:00.000
3 1 2013-10-08 01:00:00.000 20 2013-10-08 01:00:00.000
4 1 2013-10-08 01:15:00.000 25 2013-10-08 01:15:00.000
5 1 2013-10-08 01:30:00.000 30 2013-10-08 01:30:00.000
6 1 2013-10-08 01:35:00.000 30 2013-10-08 01:30:00.000
7 1 2013-10-08 01:50:00.000 30 2013-10-08 01:45:00.000
8 1 2013-10-08 01:55:00.000 30 2013-10-08 01:45:00.000
Это округляется до ближайших 15 минут
SELECT dateadd(minute, datediff(minute, 0, Date)/15*15, 0)
FROM yourtable