2012-03-15 156 views
0

查詢希望有些人能幫助我解決這個: 我的表是:如何優化使用多個子select語句

id Version datetime  name  resource 
---|--------|------------|--------|--------- 
1 | 1  | 03/03/2009 | con1 | 399 
2 | 2  | 03/03/2009 | con1 | 244 
3 | 3  | 01/03/2009 | con1 | 555 
4 | 1  | 03/03/2009 | con2 | 200 
5 | 2  | 03/03/2009 | con2 | 500 
6 | 3  | 04/03/2009 | con2 | 600 
7 | 4  | 31/03/2009 | con2 | 700 

我需要選擇具有最大的價值每一個不同的「名字」 「日期時間」小於或等於給定日期;如果有多個滿足第一個條件的記錄,則版本是最大版本。

如果給定的日期是結果'04/03/2009' 年將是:

id Version datetime  name  resource 
---|--------|------------|--------|--------- 
2 | 2  | 03/03/2009 | con1 | 244 
6 | 3  | 04/03/2009 | con2 | 600 

目前我已經創建了下面的查詢,其工作原理,但我懷疑這是不是最好的,當談到以在大桌面上運行時的性能:

SELECT [id], [Version], [datetime], [name], [resource] 
FROM theTable 
WHERE [Version] = 
(
SELECT MAX(Version) FROM theTable AS theTable2 WHERE theTable.[name] = theTable2.[name] 
AND theTable2.[datetime] = 
    (
    SELECT MAX(theTable3.[datetime]) FROM theTable AS theTable3 
    WHERE theTable2.[name] = theTable3.[name] AND theTable3.[datetime] <= '04/03/2009' 
    ) 
) 

如果某人能夠提出更有效的方法來做到這一點,如果可能的話,提供一個例子:-)。

在此先感謝。

回答

2

您可以使用PARTITION BY。這可以讓你基本上排名的結果。在你的實例中,你只需要選擇排名爲1的結果。首先,用無效的日期時間(使用WHERE)過濾結果,然後在分區中按降序排序(因此,第一個結果是一個具有最大日期時間,並且在日期時間平行的情況下,最大版本也是如此。)

SELECT [id], [Version], [datetime], [name], [resource] 
FROM 
(
    SELECT [id], [Version], [datetime], [name], [resource], row_number() 
    OVER (PARTITION BY [name] ORDER BY [datetime] DESC, [Version] DESC) as groupIndex 
    FROM theTable 
    WHERE [datetime] <= '04/03/2009' 
) AS t 
WHERE groupIndex = 1 
+0

Thanks @ Brisbe42,這絕對是更高性能,更具可讀性。我將來會更多地使用這個語法。注意,在編譯之前需要一個別名,即「select ... from(...)** AS T ** where groupIndex = 1」 – 2012-03-18 19:28:38