2016-08-12 24 views
0

我有這樣SQL的GroupBy日期時間超過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分鐘分組數據,那我該怎麼做?

例如,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

通過對分減去一個模量,並截斷到分鐘:

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分鐘數量的時間,然後按該數量進行分組。要做到這一點,我必須經過幾個步驟。我如何爲你製作一個標準功能,以幫助保持你的代碼更清潔?我有datepart(minute,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 

一個函數來完成,然後到u SE的功能在dbo.fn_DateTime_n_MinuteSector(d.time,15)

+1

只是一個建議,讓你的答案更好,總是對OP錯過了一些意見,而只是代碼 – tharif

+1

@tharif當然,我可以這樣做,我正在添加一個解釋,但我會添加更多 – Cato

相關問題