如何在不使用循环的情况下在sql中检索重复数据?

时间:2015-01-08 18:17:39

标签: sql-server

我有一个帮助台系统,其中有一张带有故障单详细信息的表格。我在SQL服务器中有一个表,其数据类似于此,

ID    status        create_date       closing_date       
---------------------------------------------------------
 1    closed    2015-01-01 14:06:30   2015-01-02 18:06:42
 2    closed    2015-01-01 15:16:42   2015-01-02 08:12:10
 -      -               -                     -
 -      -               -                     -

现在我想显示过去5个星期过去2个月关闭门票所需的小时数。

例如,我想显示从今天开始的过去5周内的数据(49,50,51,52,1),每周应查看过去2个月的关闭门票。 (第49周,数据应在第49周至第60天和第49周结束日期之间)。

目前,我已经使用循环来获得这样的结果,

declare @week_start datetime, @week_end datetime, @week int, @last_week int, @week_number int
set @last_week = datepart(wk, dateadd(wk, -1, getdate()))
set @week_number = dbo.F_ISO_WEEK_OF_YEAR(dateadd(wk, -5, getdate()))
set @week = @last_week - 4
set @week_start = dateadd(day, -60, dateadd(wk, -5, DATEADD(week, DATEDIFF(day, 0, getdate())/7, 4)))
set  @week_end = dateadd(wk, -5, DATEADD(week, DATEDIFF(day, 0, getdate())/7, 4))
while  @week <= @last_week
begin
select @week_number as week_number,
cast(avg(cast(Datediff(hour,create_date,closing_date) as decimal (10,2))) as decimal(10,2)) Hours
FROM tickets
where closing_date between @week_start
and @week_end
--group by dbo.F_ISO_WEEK_OF_YEAR(closing_date )
set @week_start = dateadd(wk, 1, @week_start)
set @week_end = dateadd(wk, 1, @week_end)
set @week = @week + 1
set @week_number = @week_number + 1
end

返回以下数据

week_number    Hours
--------------------
   49         121.56
   50         129.06
   51         125.57
   52         125.90 
   53         130.52

现在,我不想使用循环,因为它会弄乱周数,我也想显示ISO周数。

所以这是我修改过的代码,

select dbo.F_ISO_WEEK_OF_YEAR(closing_date) as week_number,
cast(avg(cast(Datediff(hour,create_date,closing_date) as decimal (10,2))) as decimal(10,2)) Hours
FROM tickets
where closing_datebetween DATEADD(wk, -5, getdate()) and DATEADD(wk, -1, getdate())
group by dbo.F_ISO_WEEK_OF_YEAR(closing_date)

但它会返回以下数据,这些数据不正确,因为它没有查看特定周的过去2个月,

week_number    Hours
--------------------
   49         142.69
   50         262.76
   51         95.50
   52         85.39 
   1         75.90

我不知道如何在不使用循环的情况下修改查询以获得相同的结果。

任何帮助将不胜感激。

感谢。

1 个答案:

答案 0 :(得分:0)

在没有看到你的基础数据的情况下获得完整的上下文有点困难,但我的第一个猜测是你的迭代代码,你有一个滑动窗口(即5周前你看过去2个月+ 5周,4周前,过去2个月+4等)。您的select语句静态查看某个时间点的值。

如果您运行的是SQL Server 2012+,则可以使用行框来定义这样的滑动窗口(http://msdn.microsoft.com/en-us/library/ms189461.aspx)。或者,我谨慎地说,如果你只需要返回5行,那么在同一个表中点击5次这样的报告并不是那么糟糕。如果您可以提供示例数据,则可以获得更多特定于代码的回复。