0
我有这样的一个表:平均最高10底float_value的,有日期,集团按日期
| prodID | date | perm
---------------------------------
|200 |8/7/2011 | 81.742
|200 |8/7/2011 | 81.644
|200 |8/7/2011 | 81.302
|200 |8/7/2011 | 81.057
|201 |8/7/2011 | 80.932
|201 |8/7/2011 | 80.839
|201 |8/7/2011 | 80.622
|201 |8/7/2011 | 80.557
|201 |8/7/2011 | 80.541
(除了有点大) 发生了什么故障:我想借此平均的前10个值(和底部10个值),其中在这种情况下PRODID = someValue中200
代码:
declare @myid int
set @myid = 200
;with high as --top ten average
(
select prodid, CONVERT(CHAR(10), DATEADD(DAY, AVG(DATEDIFF(DAY, 0, CONVERT
(SMALLDATETIME, [date]))), 0), 101) as date, max(perm)as max_perm, avg(perm)
as
high_perm from
(select prodid, date, perm,
row_number() over(partition by date order by perm desc) as nt
from live_pilot_plant
where prodid = @myid) as T
where nt <= 10
group by prodid
),
low as -- bottom ten average
(
select prodid, CONVERT(CHAR(10), DATEADD(DAY, AVG(DATEDIFF(DAY, 0, CONVERT
(SMALLDATETIME, [date]))), 0),101) as date, min(perm) as min_perm, avg(perm)
as low_perm from
(select prodid, date, perm,
row_number() over(partition by date order by perm asc) as nt
from live_pilot_plant
where prodid = @myid) as T
where nt <= 10
group by prodid
)
select l.prodid, l.date, l.low_perm as low_avg, m.high_perm as high_avg,
(m.high_perm - l.low_perm) as delta
from low l
left outer join high m
on l.prodid = m.prodid
将会产生这样的事情:
| prodID | date | low_avg | high_avg | delta |
| 200 | 08/07/2011 | 68.752 | 79.1976 | 10.444 |
这些数字是不准确的 -
这是所有良好和花花公子 - 除了不很versitle。我的意思是有很多prodID,并且基于prodID做一个这个太慢了。我怎样才能获得low_avg并根据日期(组由PRODID)的high_avg
事情是这样的:
| date | prodID | low_avg | high_avg | delta |
| 08/07/2011 | 200 | 60 | 80 | 20 |
| 08/07/2011 | 201 | 70 | 100 | 100 |
注:您可能已经注意到日期的疯狂转换盈。原因是一些prodID重叠日期即。 200日在2011年8月7日和2011年8月8日,我需要平均日期(这是一个varchar)。因此,就像2011年8月7日有100行,然后是2011年8月8日的9行,最终查询会生成日期为2011年8月7日
@GordanLinoff我在哪里可以把我在那里约会,如“/ 7/8/2011”这个查询是有点难受,乍一看得到 – akwarywo 2012-07-18 19:55:36
对不起,我没有意识到你想在特定的一天。我修改了查询以将其包含在分区子句,分组依据和外部选择中。 – 2012-07-18 19:57:59
@GordanLinoff - 你抽烟很快!令人惊叹的..非常感谢你。 – akwarywo 2012-07-18 20:02:11