2012-07-18 75 views
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日

回答

1

以下查詢是否所有產品在一次:

select lpp.prod_id, lpp.date, 
     AVG(case when seqnum_asc <= 10 then perm end) as avg_bottom10, 
     AVG(case when seqnum_desc <= 10 then perm end) as avg_top10, 
     (AVG(case when seqnum_desc <= 10 then perm end) - AVG(case when seqnum_asc <= 10 then perm end)) as delta 
from (select lpp.*, 
      ROW_NUMBER() over (partition by prodid, date order by perm) as seqnum_asc, 
      ROW_NUMBER() over (partition by prodid, date order by perm desc) as seqnum_desc 
     from live_pilot_plan lpp 
    ) lpp 
group by lpp.prod_id, lpp.ate 
+0

@GordanLinoff我在哪裏可以把我在那裏約會,如「/ 7/8/2011」這個查詢是有點難受,乍一看得到 – akwarywo 2012-07-18 19:55:36

+0

對不起,我沒有意識到你想在特定的一天。我修改了查詢以將其包含在分區子句,分組依據和外部選擇中。 – 2012-07-18 19:57:59

+0

@GordanLinoff - 你抽菸很快!令人驚歎的..非常感謝你。 – akwarywo 2012-07-18 20:02:11