Среднее после фиксированного интервала и Group By в SQL - PullRequest
0 голосов
/ 12 июня 2018

Можно ли выполнить усреднение после каждого фиксированного интервала и сгруппировать по одному столбцу в MSSQL?

Предположим, у меня есть таблица A в следующем виде:

NAME  Interval  Data1  Data2
1      0.01     1      4
1      0.05     4      2
1      0.09     7      6
1      0.11     1      2
1      0.15     7      6
1      0.18     3      1
1      0.19     2      5
2      0.209    9      0

Я хочу, чтобы выходные данные были сгруппированыпо имени и запустить в среднем каждые 10 отсчетов.Итак, для примера

Name - 1
Interval Start - 0
Interval End - 10
Data 1 Avg - 4 [(1 + 4 + 7) / 3]
Data 3 Avg - 4 [(4 + 2 + 6) / 3]

И

Name - 1
Interval Start - 10
Interval End - 20
Data 1 Avg - 3.25 [(1 + 7 + 3 + 2) / 4]
Data 3 Avg - 3.50 [(2 + 6 + 1 + 5) / 4]

Итак, я хочу выпускной, как показано ниже.Интервал для столбца «Имя» отличается.

Name Interval-Start Interval-End DataAvg1  DataAvg2
 1      0                10         4         4
 1      10               20         3.25      3.50
 2      0                10         0         0
 2      10               20         0         0
 2      20               30         9         0

Я использовал приведенный ниже запрос, но не могу понять логику для интервала.

SELECT Name, Interval, AVG(Data1) AS Data1Avg, AVG(Data2) AS  Data2Avg
FROM TableA
GROUP BY Name;

Может кто-нибудь, пожалуйста, помогите мне с этим.

1 Ответ

0 голосов
/ 12 июня 2018

с использованием курсора и временной таблицы

--drop table dbo.#result
--drop table dbo.#steps

CREATE TABLE dbo.#result
   (   
   [Name] varchar(50), 
   [Interval-Start] float,
   [Interval-End] float, 
   [DataAvg1] float, 
   [DataAvg2] float
   ) 

CREATE TABLE dbo.#steps
   (   
   [IntervalStart] float,
   [IntervalEnd] float
   ) 

declare @min int, @max int, @step float
DECLARE @Name varchar(50), @IntervalStart float, @IntervalEnd float;  

set @min = 0
set @max = 1
set @step = 0.1

insert into #steps
select @min + Number * @step IntervalStart, @min + Number * @step + @step IntervalEnd
from master..spt_values
where type = 'P' and number between 0 and (@max - @min) / @step


DECLARE _cursor CURSOR FOR
SELECT [Name], [IntervalStart], [IntervalEnd] FROM 
(select [Name] from [TableA] Group by [Name]) t
INNER JOIN #steps on 1=1

OPEN _cursor;  

FETCH NEXT FROM _cursor  
INTO @Name, @IntervalStart, @IntervalEnd;  

WHILE @@FETCH_STATUS = 0  
BEGIN

   insert into dbo.#result
   select @Name, @IntervalStart, @IntervalEnd, AVG(CAST(Data1 as FLOAT)), AVG(CAST(Data2 as FLOAT))
   FROM [TableA]
   where [NAME] = @Name and Interval between @IntervalStart and @IntervalEnd

   FETCH NEXT FROM _cursor  
   INTO @Name, @IntervalStart, @IntervalEnd;  
END  

CLOSE _cursor;  
DEALLOCATE _cursor;

select * from dbo.#result
...