密集排名的最大记录

时间:2011-06-22 13:09:32

标签: sql tsql

使用max获取最大记录是否有更好的选择。 我一直在使用以下查询进行密集排名和分区 但是我得到了不良后果和糟糕的表现。

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

非常感谢。

3 个答案:

答案 0 :(得分:1)

提供的查询不使用DENSE_RANK窗口函数。不熟悉您的数据结构,我相信您的查询试图为每个行业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

此外,为了解决绩效问题,您可能需要了解行业的结构。该表可能没有索引,如果有,则可能不会覆盖Date(降序)和id字段。要提高上述查询的效率,请不要撤回RANKED部分中的所有内容。我这样做是因为我不确定你需要哪些字段,但显然你不得不退回,引擎检索数据的效率就越高。

答案 1 :(得分:0)

您使用的是哪个数据库?如果您使用的是Oracle,那么您可以编写一些pl / sql,其中包含一个寻找最大值的循环(它不是那么高效,但它是可能的)。如果您要构建查询来执行此操作,则必须使用分析函数。

答案 2 :(得分: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