关于表格结构,该表格包含每个国家/地区的每周产品价格。 我的目标是为每个国家/地区的每种产品选择最近一周/年的每种产品的最低价格。 下面的查询可以实现此目标,但是在性能上非常慢。我想知道是否有更有效的方法来完成相同的任务。
在第一部分中,我选择了每个国家/地区的最新价格和年份。我包括了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
答案 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