2016-08-12 2 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

통해 분에 계수를 substracting하고 분으로 절단 :

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 (분, dtime))/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) 
       ) 
여기

가 U에 다음 먼저

-- ================================================ 
-- 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