【问题标题】:Average after fixed interval and Group By in SQLSQL中固定间隔和分组依据后的平均值
【发布时间】:2018-06-12 00:25:40
【问题描述】:

是否可以在每个固定间隔后进行平均并在 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;

谁能帮帮我。

【问题讨论】:

    标签: group-by average


    【解决方案1】:

    使用游标和临时表

    --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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-11-10
      • 1970-01-01
      • 2020-05-15
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      • 2021-02-06
      相关资源
      最近更新 更多