有没有更好的选择来使用max来获取最大记录。 我一直在使用密集的排名和分区与下面的查询 ,但我得到不希望的结果和糟糕的表现。排名最高的记录
select Tdate = (Select max(Date)
from Industries
where Industries.id = i.id
and Industries.Date <= '22 June 2011')
from #ii_t i
非常感谢。
有没有更好的选择来使用max来获取最大记录。 我一直在使用密集的排名和分区与下面的查询 ,但我得到不希望的结果和糟糕的表现。排名最高的记录
select Tdate = (Select max(Date)
from Industries
where Industries.id = i.id
and Industries.Date <= '22 June 2011')
from #ii_t i
非常感谢。
您使用的是哪个数据库?如果你在Oracle中,你可以写PL/SQL的一点点带有一个循环,寻找最大值(这不是那么高性能的,但它是可能的)。如果你的意思是建立一个查询来做到这一点,你必须玩分析功能。
提供的查询不使用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部分中的所有内容。我这样做,因为我不知道你需要什么字段,但显然你必须撤回的越少,引擎在检索数据时效率就越高。
非常感谢球员,已经把我领到了正确的方向。 – jwe330
试试这个(未经测试)的代码,看看它是否你想要做什么。从外观上看,它应该返回相同的东西,希望更快一点。
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
我使用的SQL Server。 – jwe330