Sql Server 数据库按周汇总数据性能问题

sagitta1130 2010-05-19 02:18:27
要求如下:

统计一张表里面的数据,数据动态增长,目前已有20万条,SQL Server 2000数据库。

规定按每年的每周汇总,如:
一年有1,2,3,4,5,......,52 周
依次以每周的起止和结束时间去表里检索数据,统计字段有:周时间段,数量,如果没有,数量为0,效果如下:

以2010年为例:

周时间段 数量
12/28-1/3 5
1/4 - 1/10 15
1/11- 1/17 0
........
12/27-1/2 20

就是这样的效果。


我现在统计的,在SQL Server2000里面运行要6分钟,性能太差,不知道各位有没有好的办法,急等,多谢了!

要求在界面显示时,一年52周都要显示,没有数据的,周的起始和结束时间也要显示,只是数量显示0.




...全文
222 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
adandelion 2011-05-23
  • 打赏
  • 举报
回复
MARK12345
sagitta1130 2010-05-19
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 pbsh 的回复:]
20w数据分组统计6分钟是有点慢哦,不知道你机器配置如何。
做一个周配置表,包含周,起止日期。

对数据表用week(日期)分组,再关联一下取起止日期试试看。
[/Quote]

我机器的配置相当高,是Dell服务器呢,4颗独立CPU,8G内存!
用周配置表,好像时间复杂度还是差不多的!
sagitta1130 2010-05-19
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 dawugui 的回复:]
我感觉楼主是需要一个时间表(包含每周的周一到周日),然后去左连接表,然后分组查询吧?
[/Quote]

如果是将周预先写到表里面,再按每周的时间来检索,其中时间复杂度和我原先设计 的应该差不多,时间还是长!
dawugui 2010-05-19
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 sagitta1130 的回复:]
引用 4 楼 pbsh 的回复:
datepart(wk,日期)分组


按这个分组我也用了,但是却显示不出每周的起始时间和结束时间。
[/Quote]
按照五楼的建议,你需要先生成一个包含所有周一到周日的时间表.
sagitta1130 2010-05-19
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 pbsh 的回复:]
datepart(wk,日期)分组
[/Quote]

按这个分组我也用了,但是却显示不出每周的起始时间和结束时间。


永生天地 2010-05-19
  • 打赏
  • 举报
回复
我觉得如果用函数作,那太慢了。

只有做个表,把数据写死到表里,可以将几十年的数据都做进去,甚至几百年的。
dawugui 2010-05-19
  • 打赏
  • 举报
回复
这里有段获取每个周日的代码,你参考一下:
DECLARE @Date datetime
DECLARE @StartDate datetime
DECLARE @EndDate datetime
DECLARE @WeekDay int
DECLARE @i int

SET DATEFIRST 7 --设置每周的第一天
SET @StartDate='2010-01-01' --统计的开始日期
SET @EndDate='2010-12-31' --统计的结束日期
SET @WeekDay=1 --根据实际的@@DATEFIRST而定
SET @i=DATEPART(weekday,@StartDate)
IF(@i<=@WeekDay AND @i<7)
SET @i=@WeekDay-@i
ELSE IF(@i<=@WeekDay AND @i=7)
SET @i=@i-@WeekDay
ELSE
SET @i=@@DATEFIRST-@i+@WeekDay

SET @Date=DATEADD(day,@i,@StartDate)
WHILE @Date<=@EndDate
BEGIN
IF(@StartDate<=@Date) PRINT CONVERT(nvarchar(10),@Date,121)
SET @Date=DATEADD(Week,1,@Date)
END
GO


/*
2010-01-03
2010-01-10
2010-01-17
2010-01-24
2010-01-31
2010-02-07
2010-02-14
2010-02-21
2010-02-28
2010-03-07
2010-03-14
2010-03-21
2010-03-28
2010-04-04
2010-04-11
2010-04-18
2010-04-25
2010-05-02
2010-05-09
2010-05-16
2010-05-23
2010-05-30
2010-06-06
2010-06-13
2010-06-20
2010-06-27
2010-07-04
2010-07-11
2010-07-18
2010-07-25
2010-08-01
2010-08-08
2010-08-15
2010-08-22
2010-08-29
2010-09-05
2010-09-12
2010-09-19
2010-09-26
2010-10-03
2010-10-10
2010-10-17
2010-10-24
2010-10-31
2010-11-07
2010-11-14
2010-11-21
2010-11-28
2010-12-05
2010-12-12
2010-12-19
2010-12-26
*/
dawugui 2010-05-19
  • 打赏
  • 举报
回复
另外我觉得这个周的问题如果遇到跨年度,该怎么计算.

例如:2010-01-01这天算2010年的,还是2009年的?


觉得需要自己来定义了.帮顶.
dawugui 2010-05-19
  • 打赏
  • 举报
回复
我感觉楼主是需要一个时间表(包含每周的周一到周日),然后去左连接表,然后分组查询吧?
pbsh 2010-05-19
  • 打赏
  • 举报
回复
datepart(wk,日期)分组
pbsh 2010-05-19
  • 打赏
  • 举报
回复
20w数据分组统计6分钟是有点慢哦,不知道你机器配置如何。
做一个周配置表,包含周,起止日期。

对数据表用week(日期)分组,再关联一下取起止日期试试看。
dawugui 2010-05-19
  • 打赏
  • 举报
回复
--假设dt为时间字段,val为数量字段
select nian,
sum(case zhou when 1 then val else 0 end) [1],
sum(case zhou when 2 then val else 0 end) [2],
sum(case zhou when 3 then val else 0 end) [3],
...
sum(case zhou when 52 then val else 0 end) [52]
from
(
select year(dt) nian, datepart(wk,dt) zhou,val from tb
) t
group by nian
liuxg1981 2010-05-19
  • 打赏
  • 举报
回复
學習中

22,298

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧