Мне кажется удивительно трудным в 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)
время - minutepart по модулю 15? – jarlh