在 SQL Server 2005 中分区数周
Partition over weeks in SQL Server 2005
我在 table 中有两列日期。一个日期代表预期日期,另一个代表工作完成的日期。我想查询以获取完成了多少工作,包括当年的特定一周以及该周应该完成多少工作。
因此,如果我将这两个列中的日期(以周为单位)转换为:
wkx:7,7,7,8,8,9,10,10,10,10,11,11
wkf:7,8,10,10,12,13,14,15,16,17,18,19
响应应该是这样的:
wk:7,8,9,10,11,12,13,14,15,16,17,18,19
numx:3,5,6,10,12,12,12,12,12,12,12,12,12
numf:1,2,2,4,4,5,6,7,8,9,10,11,12
我正在使用 SQL Server 2005,甚至不知道如何在一个列中获得不同的星期,就像示例中那样。
此致
最简单的方法 (?) 可能是使用适当的数字源来生成周间隔,然后根据周数进行条件聚合。系统 table master..spt_values
有一列可用于周数,expected
和 finished
日期的周数可以使用 datepart(wk, expected)
提取但这会产生一些奇怪的结果,所以我建议使用 this excellent answer.
中的 dbo.f_isoweek()
函数
函数:
CREATE function f_isoweek(@date datetime)
RETURNS INT
AS
BEGIN
RETURN (datepart(DY, datediff(d, 0, @date) / 7 * 7 + 3)+6) / 7
END
查询将如下所示:
select
week = number,
numx = sum(case when dbo.f_isoweek(expected) = number then 1 else 0 end),
numf = sum(case when dbo.f_isoweek(finished) = number then 1 else 0 end),
from master..spt_values, your_table
where type='p' -- the type for the numbers in spt_values
-- limit to current year
and datepart(year, expected) = datepart(year, getdate())
and datepart(year, finished) = datepart(year, getdate())
group by number
-- limit weeks to available range (could be replaced with number between 1 and 53)
having number >= dbo.f_isoweek(min(expected)) and number <= dbo.f_isoweek(max(finished))
给定输入 table 例如:
expected finished
2015-01-05 2015-01-16
2015-01-06 2015-01-07
2015-01-18 2015-01-20
2015-01-25 2015-01-26
2015-01-26 2015-01-27
2015-02-08 2015-02-10
2015-02-10 2015-02-16
输出将是:
week numx numf
2 2 1
3 1 1
4 1 1
5 1 2
6 1 0
7 1 1
8 0 1
我在 table 中有两列日期。一个日期代表预期日期,另一个代表工作完成的日期。我想查询以获取完成了多少工作,包括当年的特定一周以及该周应该完成多少工作。
因此,如果我将这两个列中的日期(以周为单位)转换为:
wkx:7,7,7,8,8,9,10,10,10,10,11,11
wkf:7,8,10,10,12,13,14,15,16,17,18,19
响应应该是这样的:
wk:7,8,9,10,11,12,13,14,15,16,17,18,19
numx:3,5,6,10,12,12,12,12,12,12,12,12,12
numf:1,2,2,4,4,5,6,7,8,9,10,11,12
我正在使用 SQL Server 2005,甚至不知道如何在一个列中获得不同的星期,就像示例中那样。
此致
最简单的方法 (?) 可能是使用适当的数字源来生成周间隔,然后根据周数进行条件聚合。系统 table master..spt_values
有一列可用于周数,expected
和 finished
日期的周数可以使用 datepart(wk, expected)
提取但这会产生一些奇怪的结果,所以我建议使用 this excellent answer.
dbo.f_isoweek()
函数
函数:
CREATE function f_isoweek(@date datetime)
RETURNS INT
AS
BEGIN
RETURN (datepart(DY, datediff(d, 0, @date) / 7 * 7 + 3)+6) / 7
END
查询将如下所示:
select
week = number,
numx = sum(case when dbo.f_isoweek(expected) = number then 1 else 0 end),
numf = sum(case when dbo.f_isoweek(finished) = number then 1 else 0 end),
from master..spt_values, your_table
where type='p' -- the type for the numbers in spt_values
-- limit to current year
and datepart(year, expected) = datepart(year, getdate())
and datepart(year, finished) = datepart(year, getdate())
group by number
-- limit weeks to available range (could be replaced with number between 1 and 53)
having number >= dbo.f_isoweek(min(expected)) and number <= dbo.f_isoweek(max(finished))
给定输入 table 例如:
expected finished
2015-01-05 2015-01-16
2015-01-06 2015-01-07
2015-01-18 2015-01-20
2015-01-25 2015-01-26
2015-01-26 2015-01-27
2015-02-08 2015-02-10
2015-02-10 2015-02-16
输出将是:
week numx numf
2 2 1
3 1 1
4 1 1
5 1 2
6 1 0
7 1 1
8 0 1