Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 在SQL Server中根据所需的时间间隔对记录进行分组_Sql Server_Date_Aggregate Functions - Fatal编程技术网

Sql server 在SQL Server中根据所需的时间间隔对记录进行分组

Sql server 在SQL Server中根据所需的时间间隔对记录进行分组,sql-server,date,aggregate-functions,Sql Server,Date,Aggregate Functions,如果我的记录如下,有4列标准、值、开始日期、结束日期。从可用的起始日期,我需要将值与时间间隔分组 如果startdate是8.56,间隔是10分钟,那么我需要将记录从8.56分组到9.05 criteria Value startdate EndDate exceptions 5 2017-12-13 08:56:00.000 2017-12-13 09:00:00.000 exceptions 2 2017-1

如果我的记录如下,有4列标准、值、开始日期、结束日期。从可用的起始日期,我需要将值与时间间隔分组

如果startdate是8.56,间隔是10分钟,那么我需要将记录从8.56分组到9.05

criteria    Value   startdate                   EndDate

exceptions  5       2017-12-13 08:56:00.000     2017-12-13 09:00:00.000
exceptions  2       2017-12-13 09:01:00.000     2017-12-13 09:05:00.000
exceptions  1       2017-12-13 09:06:00.000     2017-12-13 09:10:00.000
exceptions  3       2017-12-13 09:11:00.000     2017-12-13 09:15:00.000
exceptions  1       2017-12-13 09:16:00.000     2017-12-13 09:20:00.000
我想按要求的时间间隔将记录分组,如10分钟、12分钟和15分钟

如果间隔为10分钟,则结果应如下所示,聚合-总和值

exceptions  7   2017-12-13 08:56:00.000     2017-12-13 09:05:00.000
exceptions  4   2017-12-13 09:06:00.000     2017-12-13 09:15:00.000
exceptions  1   2017-12-13 09:16:00.000     2017-12-13 09:20:00.000 
如何实现这一点?

请尝试以下方法:

declare @tab table (criteria varchar(100), [value] int, startdate datetime, enddate datetime)

insert into @tab
select 'exceptions', 5, '2017-12-13 8:56:00.000', '2017-12-13 9:0:0.000'
union all
select 'exceptions', 2, '2017-12-13 9:01:00.000', '2017-12-13 9:05:0.000'
union all
select 'exceptions', 1, '2017-12-13 9:06:00.000', '2017-12-13 9:10:0.000'
union all
select 'exceptions', 3, '2017-12-13 9:11:00.000', '2017-12-13 9:15:0.000'
union all
select 'exceptions', 1, '2017-12-13 9:16:00.000', '2017-12-13 9:20:0.000'

declare @interval int = 10--15,20   --change here
declare @start int = 10--15,20      --also change here

declare @i int = 1
declare @stdt datetime
declare @eddt datetime
declare @tab_new table (criteria varchar(100), [value] int, interval int, grp int, start_dt datetime, end_date datetime)
while ((select count(1) from @tab) > 0)
begin
    set @stdt = (select top 1 startdate from @tab)
    set @eddt = (select top 1 enddate from @tab)

    insert into @tab_new
    select criteria, [value], @interval - DATEDIFF(MINUTE, dateadd(minute, -1, startdate), enddate), @i, @stdt, @eddt from @tab where startdate = @stdt and enddate = @eddt
    set @interval -= DATEDIFF(MINUTE, dateadd(minute, -1, @stdt), @eddt)

    delete from @tab where startdate = @stdt and enddate = @eddt
    if @interval = 0 begin set @i += 1 set @interval = @start end
end

select criteria, sum([value]) [value], min(start_dt) startdate, max(end_date) enddate from @tab_new
group by criteria, grp

HTH.

以下是一个基于集合的示例,用于满足您的特定需求:


提供CREATE TABLE DDL和INSERT语句,而不是图片。由于对齐问题,可能会出现重复。我将其粘贴为图像。使用SQL脚本,格式为代码,对齐应该不会有问题。您的组是否从当天第一次开始?
DECLARE
      @MinuteInterval int = 10
    , @StartDate datetime2(3)
    , @EndDate datetime2(3);
SELECT
      @StartDate = MIN(StartDate)
    , @EndDate = MAX(EndDate)
FROM dbo.Example;
WITH intervals AS (
    SELECT
          criteria
        , value
        , DATEADD(minute, (DATEDIFF(minute, @StartDate, StartDate) / @MinuteInterval) * @MinuteInterval, @StartDate) AS StartInterval
        , EndDate
    FROM dbo.Example
    )
SELECT
      criteria
    , SUM(value) AS ValueCount
    , StartInterval
    , CASE WHEN DATEADD(minute, @MinuteInterval - 1, StartInterval) < @EndDate 
        THEN DATEADD(minute, @MinuteInterval-1, StartInterval)
        ELSE @EndDate END AS EndInterval
FROM intervals
GROUP BY
      criteria
    , StartInterval
ORDER BY
      criteria
    , StartInterval;