2016-07-29 1 views
0

Я хочу Группировать 3 строки по 5 минут в одну из 15 минут и иметь возможность сделать обновление на 3-й строке, если захочу.Sql Группировка 3 строки по 5 минут в одну из 15 минут

Вот пример:

2016-07-29 14:00:00.000  2016-07-29 14:05:00.000 
2016-07-29 14:05:00.000  2016-07-29 14:10:00.000 
2016-07-29 14:10:00.000  2016-07-29 14:15:00.000 
2016-07-29 14:15:00.000  2016-07-29 14:20:00.000 
2016-07-29 14:20:00.000  2016-07-29 14:25:00.000 
2016-07-29 14:25:00.000  2016-07-29 14:30:00.000 
2016-07-29 14:30:00.000  2016-07-29 14:35:00.000 
2016-07-29 14:35:00.000  2016-07-29 14:40:00.000 
2016-07-29 14:40:00.000  2016-07-29 14:45:00.000 
2016-07-29 14:45:00.000  2016-07-29 14:50:00.000 
2016-07-29 14:50:00.000  2016-07-29 14:55:00.000 
2016-07-29 14:55:00.000  2016-07-29 15:00:00.000 
2016-07-29 15:00:00.000  2016-07-29 15:05:00.000 

И результат должен быть:

2016-07-29 14:00:00.000  2016-07-29 14:15:00.000 
2016-07-29 14:15:00.000  2016-07-29 14:30:00.000 
2016-07-29 14:30:00.000  2016-07-29 14:45:00.000 
2016-07-29 14:45:00.000  2016-07-29 15:00:00.000 
... 

Спасибо! :)

+1

они будут всегда находиться в последовательности, также, пожалуйста, помечать Соответствующие RDBMS – TheGameiswar

+0

SQL Server и хотите ли вы имеете в виду последовательности? – alexandre

+0

Я думаю, что он имеет в виду в том же хронологическом порядке – evilpenguin

ответ

0

В принципе, вы хотите усекать каждый раз до 15-минутных интервалов и использовать их для агрегации. Что-то вроде этого:

select distinct dateadd(minute, datediff(minute, 0, col1)/15 * 15, 0), 
     dateadd(minute, datediff(minute, 0, col1)/15 * 15 + 15, 0) 
0

Я использую UDF для создания динамических диапазонов дат. Можно также использовать таблицу номер/индикаторную

Declare @Date1 DateTime = '2016-07-29 14:00:00.000' 
Declare @Date2 DateTime = '2016-07-30 00:00:00.000' 

Select DateR1=RetVal,DateR2=DateAdd(MI,15,RetVal) from [dbo].[udf-Create-Range-Date](@Date1,@Date2,'MI',15) Where RetVal<@Date2 

Возвращает

DateR1     DateR2 
2016-07-29 14:00:00.000 2016-07-29 14:15:00.000 
2016-07-29 14:15:00.000 2016-07-29 14:30:00.000 
2016-07-29 14:30:00.000 2016-07-29 14:45:00.000 
2016-07-29 14:45:00.000 2016-07-29 15:00:00.000 
2016-07-29 15:00:00.000 2016-07-29 15:15:00.000 
... 
2016-07-29 23:30:00.000 2016-07-29 23:45:00.000 
2016-07-29 23:45:00.000 2016-07-30 00:00:00.000 

**

ОДС - Обратите внимание, вы можете Изменяется Дата Часть и инкремент Параметры

**

CREATE FUNCTION [dbo].[udf-Create-Range-Date] (@DateFrom datetime,@DateTo datetime,@DatePart varchar(10),@Incr int) 

Returns 
@ReturnVal Table (RetVal datetime) 

As 
Begin 
    With DateTable As (
     Select DateFrom = @DateFrom 
     Union All 
     Select Case @DatePart 
       When 'YY' then DateAdd(YY, @Incr, df.dateFrom) 
       When 'QQ' then DateAdd(QQ, @Incr, df.dateFrom) 
       When 'MM' then DateAdd(MM, @Incr, df.dateFrom) 
       When 'WK' then DateAdd(WK, @Incr, df.dateFrom) 
       When 'DD' then DateAdd(DD, @Incr, df.dateFrom) 
       When 'HH' then DateAdd(HH, @Incr, df.dateFrom) 
       When 'MI' then DateAdd(MI, @Incr, df.dateFrom) 
       When 'SS' then DateAdd(SS, @Incr, df.dateFrom) 
       End 
     From DateTable DF 
     Where DF.DateFrom < @DateTo 
    ) 

    Insert into @ReturnVal(RetVal) Select DateFrom From DateTable option (maxrecursion 32767) 

    Return 
End 

-- Syntax Select * from [dbo].[udf-Create-Range-Date]('2016-10-01','2020-10-01','YY',1) 
-- Syntax Select * from [dbo].[udf-Create-Range-Date]('2016-10-01','2020-10-01','DD',1) 
-- Syntax Select * from [dbo].[udf-Create-Range-Date]('2016-10-01','2016-10-31','MI',15) 
-- Syntax Select * from [dbo].[udf-Create-Range-Date]('2016-10-01','2016-10-02','SS',1) 
0

Использование рекурсивного CTE ..

DEMO HERE

;With cte(sdate,edate,maxdate) 
    as 
    (
    select min(sdate),dateadd(minute,15,min(sdate)),max(edate) as maxdate from #tt 
    union all 
    select dateadd(minute,15,sdate),dateadd(minute,15,edate) ,maxdate 
    from 
    cte 
    where 
    edate<=maxdate 
    ) 
    select sdate,edate from cte 
Смежные вопросы