2013-10-11 54 views
1
SELECT M.TradeDate, M.Expiry, M.Future 
FROM MTM as M 
JOIN (SELECT TradeDate, MIN(Expiry) as Expiry 
     FROM MTM 
     WHERE Code = 'GOVI' 
     and Type = 'F' 
     GROUP BY TradeDate) as T 
ON M.TradeDate = T.TradeDate and M.Expiry = T.Expiry 
WHERE M.Code = 'GOVI' 
    and M.Type = 'F' 
ORDER BY TradeDate 

在此查詢,我要解開一個TradeDate,最近到期(分鐘),並對應於該近期滿的「未來」的價值。這相應的未來意味着我現在必須有一個臃腫的嵌套查詢。查詢確實完美。但我相信必須有更快的速度(開發,不一定要執行),寫得更清楚。沒有嵌套查詢並且沒有重複完全相同的條件。我想也許OVER可以幫助,但我看不出如何。這真的是唯一的方法嗎?得到相應的(未聚合)值的彙總值

SQL通常是如此說明性的,但我覺得在這種我經常遇到的查詢形式中,查詢實際上並不像您在自己腦中做出的請求那樣讀取。

回答

1

自聯接方法是實現它的舊的,昂貴的方式,您會發現隨着表格變大,其成本會呈指數增長。自2005年以來,我們已經能夠使用窗口函數(如ROW_NUMBER())將分組結果與該行中的非分組數據一起返回。這裏是我會寫你的查詢:基於到期的價值

;WITH m AS 
(
    SELECT TradeDate, Expiry, Future, rn = ROW_NUMBER() OVER 
    (PARTITION BY TradeDate ORDER BY Expiry) 
    FROM dbo.MTM 
    WHERE Code = 'GOVI' AND Type = 'F' 
) 
SELECT TradeDate, Expiry, Future 
    FROM m 
    WHERE rn = 1 
    ORDER BY Expiry; 

基本上,這需要每一個獨特的TradeDate並應用「等級」,以每套(1-N)。

+0

@丹我包括一個示例只是爲了顯示「這是如何工作的。」這不一定意味着適合我提供的確切查詢。如果你想包括一個實際的工作示例,請發表一個答案。 –