日期范围内复杂的AVG

时间:2011-07-01 12:10:27

标签: tsql ssrs-2008 reporting-services

我有一张桌子跟踪工厂的设备安装情况。 这是一个示例:

ID  Name    Date    Percentage
1   GT-001  2011-01-08  30
2   GT-002  2011-01-11  40
3   GT-003  2011-02-02  30
4   GT-001  2011-02-03  50
5   GT-003  2011-02-15  50
6   GT-004  2011-02-15  30
7   GT-002  2011-02-15  60
8   GT-001  2011-02-20  60
9   GT-003  2011-03-01  60
10  GT-004  2011-03-05  50
11  GT-001  2011-03-10  70
12  GT-004  2011-03-15  60

以及相应的脚本:

CREATE TABLE [dbo].[SampleTable](
[ID] [int] NOT NULL,
[Name] [nvarchar](50) NULL,
[Date] [date] NULL,
[Percentage] [int] NULL) ON [PRIMARY]
GO
--Populate the table with values
INSERT INTO [dbo].[SampleTable] VALUES
('1', 'GT-001', '2011-01-08', '30'), 
('2', 'GT-002', '2011-01-11', '40'), 
('3', 'GT-003', '2011-02-02', '30'), 
('4', 'GT-001', '2011-02-03', '50'), 
('5', 'GT-003', '2011-02-15', '50'), 
('6', 'GT-004', '2011-02-15', '30'), 
('7', 'GT-002', '2011-02-15', '60'), 
('8', 'GT-001', '2011-02-20', '60'), 
('9', 'GT-003', '2011-03-01', '60'), 
('10', 'GT-004', '2011-03-05', '50'), 
('11', 'GT-001', '2011-03-10', '70'), 
('12', 'GT-004', '2011-03-15', '60');
GO

我需要的是创建一个图表,其中X上的日期和Y上的平均百分比。平均百分比是从安装过程开始的那个特定日期开始的所有设备的平均百分比(MIN!Fields!Date .Value,“EquipmentDataset”))

没有运气只使用SSRS实现这一点,我决定使用T-SQL为它创建一个更复杂的数据集。

我想添加一个名为“AveragePercentage”的计算列是非常必要的,该列应该存储该日期的平均百分比,仅计算安装过程开始之间范围内的最新设备百分比值(MIN(日期) ))和当前行的日期。闻起来像递归,但我是T-SQL的新手......))

这是所需的输出

ID  Name    Date    Percentage Average
1   GT-001  2011-01-08  30  30
2   GT-002  2011-01-11  40  35
3   GT-003  2011-02-02  30  33
4   GT-001  2011-02-03  50  40
5   GT-003  2011-02-15  50  48
6   GT-004  2011-02-15  30  48
7   GT-002  2011-02-15  60  48
8   GT-001  2011-02-20  60  50
9   GT-003  2011-03-01  60  53
10  GT-004  2011-03-05  50  58
11  GT-001  2011-03-10  70  60
12  GT-004  2011-03-15  60  63

您怎么看?

如果有任何帮助,我将非常感激。

1 个答案:

答案 0 :(得分:1)

您可以将cross applyrow_number一起使用来查找每台计算机的最新值。需要额外的子查询,因为您无法直接在row_number子句中使用where。这是查询:

select  t1.id
,       t1.Name
,       t1.Date
,       t1.Percentage
,       avg(1.0*last_per_machine.percentage)
from    SampleTable t1
outer apply
        (
        select  *
        from    (
                select  row_number() over (partition by Name order by id desc)
                          as rn
                ,       *
                from    SampleTable t2
                where   t2.date <= t1.date
                ) as numbered
        where   rn = 1
        ) as last_per_machine
group by
        t1.id
,       t1.Name
,       t1.Date
,       t1.Percentage

Working example on SE Data.