2012-03-15 48 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