繁体   English   中英

优化SQL子查询的最大值

[英]Optimize SQL Sub-Query for Max Value

我有以下查询:

    SELECT dlp.ParamID ParamID, dp.ParamName ParamName, dlp.LocID LocationID,    ml.LocName LocationName , di.Entered_On DateEntered,  dlp.FreqDays Frequency  
    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
    WHERE ( (dlp.FreqDays IS NOT NULL)  AND di.Entered_On < (GETUTCDATE() -  dlp.FreqDays))
    AND
    di.Entered_On = (select max(Entered_On ) from data_Input where LocId = dlp.LocID
                     and ParamId = dlp.ParamID)

我需要有关如何优化此查询的帮助。 瓶颈似乎在以下方面:

    di.Entered_On = (select max(Entered_On ) from data_Input where LocId = dlp.LocID
                     and ParamId = dlp.ParamID)

请注意,对于给定的Enter_On,我需要基于LocId和ParamId获取Max Entered_On日期。

我尝试了以下操作,但未获得预期的结果:

     SELECT * FROM
     (
        SELECT dlp.ParamID ParamID, dp.ParamName ParamName, dlp.LocID LocationID,  ml.LocName LocationName, di.Entered_On DateEntered,  dlp.FreqDays  Frequency,      
      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
       WHERE  dlp.FreqDays IS NOT NULL       
       ) as a WHERE a.RowNum = 1 and DateEntered < (GETUTCDATE() -   Frequency)

我认为您可以在di表上将其替换为window函数(在此作为子查询完成)。 请注意, where子句不在子查询中,因为这会影响用于max()的行(这可能是第二个查询中的问题):

SELECT dlp.ParamID ParamID, dp.ParamName ParamName, dlp.LocID LocationID,    ml.LocName LocationName , di.Entered_On DateEntered,  dlp.FreqDays Frequency  
    FROM data_LocParams dlp 
    INNER JOIN (select di.*,
                       max(Entered_On) over (partition by LocId, ParamId) as maxeo
                from data_Input di
               ) 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
    WHERE (dlp.FreqDays IS NOT NULL)  AND di.Entered_On = di.maxeo and
          di.Entered_On < (GETUTCDATE() -  dlp.FreqDays)

尝试像这样使用-

select ParamID,
   ParamName,
   LocationID,
   LocationName,
   DateEntered,
   Frequency
from (SELECT dlp.ParamID ParamID,
         dp.ParamName ParamName,
         dlp.LocID LocationID,
         ml.LocName LocationName,
         di.Entered_On DateEntered,
         dlp.FreqDays Frequency,
         row_number() over(partition by di.LocID order by di.Entered_On desc) as rn
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
WHERE  ((dlp.FreqDays IS NOT NULL) AND di.Entered_On < (GETUTCDATE() - dlp.FreqDays))
) as T
where rn = 1 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM