Sql server 在SQL Server中根据所需的时间间隔对记录进行分组
如果我的记录如下,有4列标准、值、开始日期、结束日期。从可用的起始日期,我需要将值与时间间隔分组 如果startdate是8.56,间隔是10分钟,那么我需要将记录从8.56分组到9.05Sql 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
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;