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

问题描述 投票:-1回答:2

如果我的记录如下,有4列Criteria, value, startdate, enddate。从可用的startdate我需要按时间间隔对值进行分组。

如果startdate是8.56并且interval是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分钟,那么结果应该如下,(aggregation-sum(value))

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 

我该如何实现这一目标?

sql-server date aggregate-functions
2个回答
0
投票

尝试以下方法:

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。


0
投票

以下是基于this answer的特定需求的基于集合的示例:

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;
© www.soinside.com 2019 - 2024. All rights reserved.