使用max获取最大记录是否有更好的选择。 我一直在使用以下查询进行密集排名和分区 但是我得到了不良后果和糟糕的表现。
select Tdate = (Select max(Date)
from Industries
where Industries.id = i.id
and Industries.Date <= '22 June 2011')
from #ii_t i
非常感谢。
答案 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