2016-08-12 5 views
0

У меня есть запрос, как этотSQL GroupBy DateTime в течение X минут

select d.Data, 
    CONVERT(VARCHAR(20), d.Time, 100) as [Time], 
    avg(d.Count) as [CountVal] 
from data d 
group by d.data, CONVERT(VARCHAR(20), d.Time, 100) 

где я группировка данных на минуту основе. Я хочу группировать данные каждые X минут, то как я могу это сделать?

Например, х = 15, и мы имеем следующие данные,

 Time    Data  Count 
-------------------  -----  ----- 
Aug 8 2016 9:00AM  data1  11 
Aug 8 2016 9:05AM  data2  12 
Aug 8 2016 9:10AM  data3  47 
Aug 8 2016 9:13AM  data3  20 
Aug 8 2016 9:14AM  data1  12 
Aug 8 2016 9:25AM  data3  61 
Aug 8 2016 9:30AM  data2  35 
Aug 8 2016 9:35AM  data1  16 
Aug 8 2016 9:40AM  data1  92 
Aug 8 2016 9:41AM  data2  19 

Я хочу, чтобы полученные данные были следующими

 Time    Data  Count 
-------------------  -----  ----- 
Aug 8 2016 9:00AM  data1  23 
Aug 8 2016 9:00AM  data2  12 
Aug 8 2016 9:00AM  data3  67 
Aug 8 2016 9:15AM  data3  61 
Aug 8 2016 9:30AM  data1  108 
Aug 8 2016 9:30AM  data2  54 

Любые идеи, как мы можем достичь этого?

Заранее благодарен!

+0

время - minutepart по модулю 15? – jarlh

ответ

1

Via вычитая модуль на минуты, и усечения в минуту:

declare @Xmin int = 15; 

select CONVERT(VARCHAR(20), [Time], 100) as [Time], Data, count(*) as [Count] 
from (
    select 
    dateadd(mi,-datepart(mi,[Time])%@Xmin,dateadd(mi,datediff(mi,0,[Time]),0)) as [Time], Data 
    from data 
) d 
group by Data, [Time] 
order by 1, 2; 
0

Мне кажется удивительно трудным в SQL, но вам нужно рассчитать время, округленное до последней 5-минутной суммы, а затем группу на эту сумму. и для этого мне пришлось пройти через несколько шагов. Как насчет того, чтобы я сделал стандартную функцию для вас, чтобы помочь очистить ваш код?

Это 5-минутный сегмент, у меня есть datepart (минута, d.Time))/5) * 5, вы можете изменить оба 5 на любое другое целое число или превратить его в целочисленную переменную - требуется (может быть сделано в более высоких версиях SQL, если вы хотите, чтобы на данный момент, если хотите), а затем до этой даты округляет количество минут в день до нижнего 5, затем добавляет их на

select d.Data, 
     dateadd(minute, 
       floor((datepart(hour,d.Time) * 60 
           + datepart(minute, d.Time))/5) * 5,   
       cast(convert(nvarchar(8), d.Time, 112) as datetime) 
       ), 
    avg(d.Count) as [CountVal] 
from data d 

GROUP BY dateadd(minute, 
       floor((datepart(hour,d.Time) * 60 
           + datepart(minute, d.Time))/5) * 5,   
       cast(convert(nvarchar(8), d.Time, 112) as datetime) 
       ) 

здесь это делается с помощью функции, вы должны сначала создать

-- ================================================ 
-- Template generated from Template Explorer using: 
-- Create Scalar Function (New Menu).SQL 
-- 
-- Use the Specify Values for Template Parameters 
-- command (Ctrl-Shift-M) to fill in the parameter 
-- values below. 
-- 
-- This block of comments will not be included in 
-- the definition of the function. 
-- ================================================ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
-- ============================================= 
-- Author:  <Author,,Name> 
-- Create date: <Create Date, ,> 
-- Description: <Description, ,> 
-- ============================================= 
CREATE FUNCTION fn_DateTime_n_MinuteSector 
(
    -- Add the parameters for the function here 
    @PDATE datetime, 
    @PNMINS int 
) 
RETURNS datetime 
AS 
BEGIN 

    DECLARE @WDATE datetime; 
    DECLARE @DAYMINS int; 
    DECLARE @ROUNDMINS int; 

    --calculate Whole Date and number of complete minutes elapsed since start of date 
    SELECT @WDATE = cast(convert(nvarchar(8), @PDATE, 112) as datetime), 
      @DAYMINS = datepart(hour,@PDATE) * 60 + datepart(minute, @PDATE); 

    --round down to n minutes in day 
    SELECT @ROUNDMINS = FLOOR(@DAYMINS/@PNMINS) * @PNMINS; 

    --create rounded date by adding minutes on to date part 
    RETURN dateadd(minute , @ROUNDMINS, @WDATE) ; 


END 
GO 

затем к и се ваши функции в dbo.fn_DateTime_n_MinuteSector (d.time, 15)

+1

просто предложение сделать ваш ответ более хорошим, всегда добавляйте некоторые комментарии к тому, что пропустил OP, а не просто код – tharif

+1

@tharif уверен, что я могу это сделать, я добавлял объяснение, но я добавлю еще несколько – Cato

Смежные вопросы