我面临以下挑战。我有2张桌子。第一个表包含特定时间(即价格目录)自行车的价值变化。这意味着某个产品的某个价格有效,直到该表中有一个新价格。
Product | RowNr | Year | Month | Value
------------------------------------------
Bike1 | 1 | 2009 | 8 | 100
Bike1 | 2 | 2010 | 2 | 400
Bike1 | 3 | 2011 | 4 | 300
Bike1 | 4 | 2012 | 9 | 100
Bike1 | 5 | 2013 | 2 | 500
Bike1 | 6 | 2013 | 5 | 200
Bike2 | 1 | 2013 | 1 | 5000
Bike2 | 2 | 2013 | 2 | 4000
Bike2 | 3 | 2014 | 6 | 2000
Bike2 | 4 | 2014 | 10 | 4000
第二个表包含我要确定自行车价值的日期(基于表1中的信息)。
Product | Date | Value
-------------------------
Bike1 | 3/01/2008 | ?
Bike1 | 04/30/2011 | ?
Bike1 | 5/08/2009 | ?
Bike1 | 10/10/2012 | ?
Bike1 | 7/01/2014 | ?
因此,第1行和第3行应获得值“ 400”,第2行“ 300”,第4行“ 100”和第5行“ 200”等。
有谁知道如何在T-SQL中实现?我已经对第一个表进行了分区,但是可以在后续步骤中使用一些建议。
非常感谢,
您可以执行类似的操作,该方法将使用小于或等于产品表日期的价格检索产品的最新价格目录值。
SELECT p.product
, p.date
, valueAsOfDate =
( SELECT TOP 1 c.value
FROM priceCatalogue c
WHERE c.product = p.product
AND convert(date,
convert(varchar(4), c.year) + '-'
+ convert(varchar(2), c.month)
+ '-1'
) <= p.date
--this order by will ensure that the most recent price is used
ORDER BY c.year desc, c.month desc
)
FROM product p
该表结构不是理想的……您最好在priceCatalogue表中使用“ AsOfDate”列,这样您就不必将priceCatalogue表中的值转换为日期来进行比较。如果这是新开发的,则将priceCatalogue表更改为具有asOfDate列(它是日期数据类型)。如果这是从另一个数据源填充的现有表,那么您可以考虑将持久化的计算列添加到表中。http://msdn.microsoft.com/en-us/library/ms188300.aspx
使用productCatalogue表上的asOfDate列,您可以使用索引来进行SARG支持的查询(是什么使SQL语句可存储?)。
SELECT p.product
, p.date
, valueAsOfDate =
( SELECT TOP 1 c.value
FROM priceCatalogue c
WHERE c.product = p.product
AND c.asOfDate <= p.date
--this order by will ensure that the most recent price is used
ORDER BY c.year desc, c.month desc
)
FROM product p
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句