好的,我通常会设置一些测试数据来玩。
下面是一些在 tempdb 中创建 [work] 表的代码。我正在跳过周末。总数是一个从0到40的随机数。
-- Just playing
use tempdb;
go
-- drop existing
if object_id ('work') > 0
drop table work
go
-- create new
create table work
(
my_date date,
my_total int
);
go
-- clear data
truncate table work;
go
-- Monday = 1
SET DATEFIRST 1;
GO
-- insert data
declare @dt date = '20131231';
declare @hr int;
while (@dt < '20140201')
begin
set @hr = floor(rand(checksum(newid())) * 40);
set @dt = dateadd(d, 1, @dt);
if (datepart(dw, @dt) < 6)
insert into work values (@dt, @hr);
end
go
这在 SQL SERVER 2012 中使用新的 LEAD() 窗口函数变得非常容易。
-- show data
with cte_summary as
(
select
row_number() over (order by my_date) as my_num,
my_date,
my_total,
LEAD(my_total, 0, 0) OVER (ORDER BY my_date) +
LEAD(my_total, 1, 0) OVER (ORDER BY my_date) +
LEAD(my_total, 2, 0) OVER (ORDER BY my_date) +
LEAD(my_total, 3, 0) OVER (ORDER BY my_date) +
LEAD(my_total, 4, 0) OVER (ORDER BY my_date) as my_sum,
(select count(*) from work) as my_cnt
from work
)
select * from cte_summary
where my_num <= my_cnt - 4
基本上,我们为每一行指定一个行号,计算第 0 行(当前)到第 4 行(4 行之外)的总和以及总计数。
由于这是五个期间的运行总计,因此剩余日期缺少数据。因此,我们将它们扔掉。 my_row
希望这能解决你的问题!
如果您只关心一个月的一个数字,请将选择更改为以下。我留下了其他行,以便您了解正在发生的事情。
select avg(my_sum/5) as my_stat
from cte_summary
where my_num <= my_cnt - 4
FOR SQL SERVER = 2005
就像这个世界上的任何事情一样,总有办法做到这一点。我使用了一个小计数表来循环遍历数据并收集 5 个数据点的集合作为平均值。
-- show data
with
cte_tally as
(
select
row_number() over (order by (select 1)) as n
from
sys.all_columns x
),
cte_data as
(
select
row_number() over (order by my_date) as my_num,
my_date,
my_total
from
work
)
select
(select my_date from cte_data where my_num = n) as the_date,
(
select sum(my_total) / 5
from cte_data
where my_num >= n and my_num < n+5
) as the_average
from cte_tally
where n <= (select count(*)-4 from work)
以下是公用表表达式 (CTE) 的说明。
cte_data = order data by date and give row numbers
cte_tally = a set based counting algorithm
五人一组计算平均值并显示日期。
此解决方案不依赖于节假日或周末。如果有数据,它只是按日期按五组为一组进行分区。
如果您需要过滤掉假期和周末,请创建一个假期表。将 where 子句添加到 cte_data 以检查 NOT IN (SELECT DATE FROM HOLIDAY TABLE)。
祝你好运!