好吧,我通常會設置一些測試數據一起玩。
以下是在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
在新的LEAD()窗口函數的SQL SERVER 2012中,這變得很容易。
-- 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 < = my_cnt -4
我希望這可以解決您的問題!
如果您只關心當月的一個號碼,請將選擇更改爲以下內容。我留下了其他行,讓你瞭解發生了什麼。
select avg(my_sum/5) as my_stat
from cte_summary
where my_num <= my_cnt - 4
爲SQL Server 2012 < &> = 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)。
祝你好運!
爲什麼在13日開始的?月份從1月份開始,對嗎?此外,它看起來像你有超過研磨範圍。 –
當然,這只是一個例子,是的,它們重疊 – Yasskier
因此,讓我們得到這個。你想從你的桌子平均五個組? –