Сложный AVG в диапазоне дат - PullRequest
2 голосов
/ 01 июля 2011

У меня есть стол с отслеживанием установки оборудования завода.Вот пример:

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 Ответ

1 голос
/ 01 июля 2011

Вы можете использовать cross apply с row_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

Рабочий пример с данными SE.

...