2013-05-16 21 views
1

我從一個臨時表,#T1選擇一些行,我創建:入門基礎的MIN和MAX計算值在表

SELECT FutContract, 
    Quantity, 
    Date, 
    Price, 
    TotalQuantity, 
    PercentOfTotalQ, 
    CumulativePercentile= 
     (SELECT ROUND(SUM(PercentOfTotalVol),2) FROM #t1 b 
     WHERE b.OvernightVol <= a.OvernightVol AND b.FutContract = a.FutContract) 

FROM #t1 a 

我想創建表示兩個行MIN(Price)和MAX(Price)的累積百分比大於0.3(第30百分位數),但我能想到的唯一方法就是創建另一個臨時表。如果可能,我寧願不必。有任何想法嗎?

編輯:

;WITH z AS 
(SELECT FutContract, OvernightVol, MorningDate, Price, TotalVol, 
    PercentOfTotalVol, CumulativePercentile= 
    (SELECT ROUND(SUM(PercentOfTotalVol),2) FROM #t1 b 
    WHERE b.OvernightVol <= a.OvernightVol AND b.FutContract = a.FutContract) FROM #t1 a) 

    SELECT *, 
     (SELECT MIN(Price) OVER(PARTITION BY FutContract) FROM z WHERE CumulativePercentile > 0.3) AS min70px, 
     (SELECT MAX(Price) OVER(PARTITION BY FutContract) FROM z WHERE CumulativePercentile > 0.3) AS max70px 
FROM z 

回答

4

如果你的SQL Server 2005或更高,一個CTE應該幫助

;with z as 
(SELECT FutContract, 
    Quantity, 
    Date, 
    Price, 
    TotalQuantity, 
    PercentOfTotalQ, 
    CumulativePercentile= 
     (SELECT ROUND(SUM(PercentOfTotalVol),2) FROM #t1 b 
     WHERE b.OvernightVol <= a.OvernightVol AND b.FutContract = a.FutContract) 

FROM #t1 a 
) 
select 
(select min(price) from z Z1 where Z1.CumulativePercentile > 0.3 and Z1.FutContract = z.FutContract) min_price, 
(select max(price) from z Z1 where Z1.CumulativePercentile > 0.3 and Z1.FutContract = z.FutContract) max_price, 
* 
from z 
+0

這幾乎正是我要找的。但是,我收到一個錯誤,因爲子查詢返回了多個值。我需要每個FutContract的最小值和最大值都是唯一的,但是我必須考慮幾個FutContract和Price組合。 我在我剛剛嘗試的代碼中編輯。 – weskpga

+0

@weskpga,不知道我理解你的要求100%,但看看我編輯的答案 – iruvar

+0

是的,編輯的代碼是我所需要的。謝謝! – weskpga