使用临时表提高选择查询的选择性能

时间:2019-02-11 13:05:14

标签: sql sql-server

关于表格结构,该表格包含每个国家/地区的每周产品价格。 我的目标是为每个国家/地区的每种产品选择最近一周/年的每种产品的最低价格。 下面的查询可以实现此目标,但是在性能上非常慢。我想知道是否有更有效的方法来完成相同的任务。

在第一部分中,我选择了每个国家/地区的最新价格和年份。我包括了CASE何时会计入新的一年。 我将其保存在#temptable中。 然后,我根据之前选择的年,周和国家/地区组合选择最低价格。

DECLARE @date DATE SET @date=getdate()

SELECT YearNb, Max(WeekNb) AS WeekNb, ISOCountryCode INTO #TempTable FROM PriceBenchWeekly  
WHERE PriceBenchWeekly.YearNb = CASE WHEN DATEPART(ww,@date)  = 1 THEN
                Year(@date)-1
                ELSE
                Year(@date)
                END
GROUP BY YearNb, ISOCountryCode

SELECT ProdNb,Min(WeeklyPrice) AS MinPrice, MarketPlayerCode, 'MKT' AS PriceOriginTypeCode, NatCoCode
FROM CE.PriceBenchWeekly INNER JOIN #TempTable ON PriceBenchWeekly.YearNb = #TempTable.YearNb AND 
PriceBenchWeekly.WeekNb = #TempTable.WeekNb AND PriceBenchWeekly.ISOCountryCode = #TempTable.ISOCountryCode

GROUP BY PriceBenchweekly.YearNb, PriceBenchWeekly.ISOCountryCode, BNCode, MarketPlayerCode

2 个答案:

答案 0 :(得分:3)

  

该表格列出了每个国家/地区的每周产品价格。我的目标是为每个国家/地区的每种产品选择最近一周/年的每种产品的最低价格。

使用窗口功能。没有样本数据和理想的结果,很难弄清您真正想要的是什么。但是,以下数据获取了数据中最近一周的每种产品的最低价格:

select pbw.*
from (select pbw.*,
             min(weeklyprice) over (partition by prodnb) as min_weeklyprice
      from (select pbw.*,
                   dense_rank() over (order by year desc, weeknb desc) as seqnum
            from CE.PriceBenchWeekly pbw
           ) pbw
      where seqnum = 1
     ) pbw
where weeklyprice = min_weeklyprice;

答案 1 :(得分:2)

如果要使用临时表,请不要使用select into创建临时表,而应使用CREATE TABLE #TempTable,然后可以为Year,Week和Country代码创建非聚集索引...

无论如何,我还是希望外部申请

SELECT DISTINCT A.ProductCode, A.CountryCode, B.YearNo, B.WeekNo, B.MinPrice
FROM YourTable A
OUTER APPLY (
    SELECT TOP 1 YearNo, WeekNo, Min(Price) AS MinPrice
    FROM YourTable 
    WHERE ProductCode = A.ProductCode AND CountryCode = B.CountryCode
    GROUP BY YearNo, WeekNo
    ORDER BY YearNo DESC, WeekNo DESC
) B