2011-06-22 75 views
0

有没有更好的选择来使用max来获取最大记录。 我一直在使用密集的排名和分区与下面的查询 ,但我得到不希望的结果和糟糕的表现。排名最高的记录

select Tdate = (Select max(Date) 
        from Industries 
        where Industries.id = i.id 
         and Industries.Date <= '22 June 2011') 
    from #ii_t i 

非常感谢。

回答

0

您使用的是哪个数据库?如果你在Oracle中,你可以写PL/SQL的一点点带有一个循环,寻找最大值(这不是那么高性能的,但它是可能的)。如果你的意思是建立一个查询来做到这一点,你必须玩分析功能。

+0

我使用的SQL Server。 – jwe330

1

提供的查询不使用DENSE_RANK窗口函数。不熟悉您的数据结构,我相信您的查询正在尝试为每个Industry ID找到Date的最大值,是吗?重写上面的查询来使用排名函数,我会把它写成一个公共表格表达式。

; 
WITH RANKED AS 
(
    SELECT 
     II.* 
    -- RANK would serve just as well in this scenario 
    , DENSE_RANK() OVER (PARTITION BY II.id ORDER BY II.Date desc) AS most_recent 
    FROM Industries II 
    WHERE 
     II.Date <= '22 June 2011' 
) 
, MOST_RECENT AS 
(
    -- This query restricts it to the most recent row by id 
    SELECT 
     R.* 
    FROM 
     RANKED R 
    WHERE 
     R.most_recent = 1 
) 
SELECT 
    * 
FROM 
    MOST_RECENT MR 
    INNER JOIN 
     #ii_t i 
     ON i.id = MR.id 

此外,为了解决性能问题,您可能需要了解行业的结构。该表可能没有索引,如果有,它可能不包括日期(降序)和ID字段。要提高上述查询的效率,请不要拉回RANKED部分中的所有内容。我这样做,因为我不知道你需要什么字段,但显然你必须撤回的越少,引擎在检索数据时效率就越高。

+0

非常感谢球员,已经把我领到了正确的方向。 – jwe330

0

试试这个(未经测试)的代码,看看它是否你想要做什么。从外观上看,它应该返回相同的东西,希望更快一点。

select Tdate = max(Industries.Date)  
from #ii_t i 
    left outer join Industries 
    on Industries.id = i.id and 
     Industries.Date <= '22 June 2011' 
group by i.id