2015-05-16 126 views
0

![在这里输入的形象描述] [1]SQL Server 2008中的另一种方式来做到这一点

带来一米的自由空间,AVG和天留下正确的结果。将不得不做另一个查询来获得最新的freespace。可以使用ROW_NUMBER排名但这将带回700没有办法做到这更好的RGS

declare @top int=3 
declare @dept varchar(20)='dept_a' 

select * from dept 

select top(@top) * 
from dept 
where usage<0 
order by datestamp desc 


select 
    freespace , 
    avgDay, 
    (freespace/avgDay) as daysLeft 
from 
    (select top(1) freespace 
    from dept 
    where deptname = @dept 
    order by datestamp desc) as freespace, 
    (select avg(usage) AvgDAy 
    from 
      (select top(@top) * 
      from dept 
      where usage < 0 
      and DeptName = @dept 
      order by datestamp desc) as AvgSel 
    ) as AvgDay 

数据http://sqlfiddle.com/#!6/210dd/1

结果系A - 920的自由空间 133平均一天 6天左 http://sqlfiddle.com/#!6/210dd/2

结果系乙 - 400自由空间 66平均一天 还剩6天 http://sqlfiddle.com/#!6/210dd/4

+1

做*什么具体*更好?您已经抛弃了SQL和结果,并且对数据的含义以及结果的含义几乎没有描述。你能解释你实际想要到达的地方吗?此外,请将SQL作为文本发布在将来的文章中,让人们可以更轻松地启动[SQL Fiddle](http://sqlfiddle.com/)来尝试各种解决方案。 –

+0

谢谢我已经更新了上面的sqlfiddle链接。 – winchmore

回答

1

这基本上是你的查询,如果我理解正确的话:

select freespace ,avgDay,(freespace/avgDay) as daysLeft 
from (select top(1) freespace 
     from dept 
     where deptname = @dept 
     order by datestamp desc 
    ) as freespace cross join 
    (select avg(usage) as AvgDAy 
     from (select top(@top) * 
      from dept 
      where usage < 0 and DeptName = @dept 
      order by datestamp desc 
      ) as AvgSel 
    ) as AvgDay 

更有效的形式是:

select max(case when seqnum_1 = 1 then freespace end) as freespace, 
     avg(case when seqnum_2 <= 3 and usage < 0 then usage end) as dailyusage, 
     (max(case when seqnum_1 = 1 then freespace end)/
     avg(case when seqnum_2 <= 3 and usage < 0 then usage end) 
     ) as days_left 
from (select d.*, 
      row_number() over (order by datestamp desc) as seqnum_1, 
      row_number() over (partition by (case when usage < 0 then 1 else 0 end) 
           order by datestamp desc) as seqnum_2 
     from dept 
     where dept = @dept 
    ) d 
where seqnum_1 = 1 or (seqnum_2 <= 3 and usage < 0); 

在一般来说,窗口函数将比order by更快。

Here是一个SQL小提琴。

+0

感谢正确的方向,但得到错误的数字http://sqlfiddle.com/#!6/210dd/8部门A的结果应该是 - 920自由空间133平均每天还剩6天 – winchmore

+0

@winchmore。 。 。 SQL小提琴确实有帮助。 –

+0

非常感谢戈登这是完美的:) – winchmore

相关问题