我有以下查询。我做的部分SQL优化查询以获取最大值
select for max(Entered_On).....
需要最长时间。如果我将注意力放在哪里,它运行得很快。
Select dlp.ParamID, dp.ParamName
from data_LocP dlp
inner join data_In di on dlp.LocID = di.LocID
inner join data_Parms dp on dp.ParamID = di.ParamID
inner join map_Loc ml on ml.LocId = dlp.LocId
where di.Entered_On = (select max(Entered_On) from data_In where LocId = dlp.LocID
and ParamId = dlp.ParamID)
我想知道如果有一种方法来优化这个查询,那是我得到的最大(Entered_On)花费时间最长的部分。作为参考,我需要Entered_On是给定LocId和ParamId的最大日期。
这里是一个更扩展的代码,但没有给出最大:
select * FROM
(
SELECT dlp.ParamID, dp.ParamName, dlp.LocID, ml.LocName , di.Entered_On, (GETUTCDATE() - dlp.FreqDays) DueDate, dlp.FreqDays,
a.CompanyId, a.SiteID,
ROW_NUMBER() OVER (PARTITION BY dlp.LocId, dlp.ParamID
ORDER BY di.Entered_On DESC)
as RowNum
from data_LocParams dlp
inner join data_Input di on dlp.LocID = di.LocID
inner join data_Parameters dp on dp.ParamID = di.ParamID
inner join map_Locations ml on ml.LocId = dlp.LocId
left join
(
select ml.LocId,ms.CompanyId, ms.SiteId
from map_Sites ms
join map_WaterSystems mw
on ms.SiteID = mw.SiteID
join map_Locations ml
on ml.SysID = mw.SysID
) a
on a.LocId = dlp.LocID
where dlp.FreqDays is not null AND dlp.FreqDays <> ''
) as a WHERE a.RowNum = 1 and Entered_On < (GETUTCDATE() - FreqDays)
为什么不使用max(entered_on)而不是row_number? – Wirus
@Wirus为每个记录提供每个LocId和Paramid的最大值,并且您不能分辨出与最大值相关的参数名(entered_on) –
@Conrad - 我放置了一个更加扩展的代码(请看上面),但似乎我无法得到它的工作基于ROW_NUMBER()..它运行,但我没有得到一个给定的LocId对一个给定的LocId ParamID。你知道我在做什么错吗.. –