2013-07-26 14 views
0

版本中使用:Microsoft SQL Server管理Studio中,SQL Server 2008中不對稱列 - 採摘最新的給定值

我面對的是由非對稱的柱造成了令人沮喪的問題。基本上,我想計算折扣對給定現貨價格的影響。兩者都在同一表pricevalues中設置爲索引。現貨價格在每週5天給出,折扣僅在更新當天說明。因此,舉例來說:

pricevalues(物價指數,價格,pricedate)

 PRICEINDEX    PRICE   PRICEDATE    
-------------------- ------------------ ------------------ 
DISCOUNT_INDEX_ID |  15.5  | 2013-02-26 
DISCOUNT_INDEX_ID |  10.5  | 2013-04-05 
DISCOUNT_INDEX_ID |  16.0  | 2013-07-10 
SPOT_INDEX_ID  |  356.5  | 2013-07-22 
SPOT_INDEX_ID  |  355.0  | 2013-07-23 
SPOT_INDEX_ID  |  354.6  | 2013-07-24 
SPOT_INDEX_ID  |  357.0  | 2013-07-25 
SPOT_INDEX_ID  |  358.5  | 2013-07-26 

我如何能最好地去計算對SPOT_INDEX_ID給出的所有日期價格對SPOT_INDEX_ID和DISCOUNT_INDEX_ID之間的區別,如果最新給出的(相對於現貨價格的PRICEDATE)折扣PRICE是要使用的嗎?

例如,在2013年7月22日上的光點的折扣是16.0(2013年7月10日),而關於2013年5月15日的光斑的折扣是10.5(2013-04 -05),以及關於2013年3月3日的點的折扣是15.5(2013年2月26日)

我只知道如何做到這一點時,PRICEDATE比賽兩個DISCOUNT_INDEX_ID和SPOT_INDEX_ID,所以:

SELECT 
(pv1.price - pv2.price) AS 'Total Price', 
pv1.price AS 'Spot Price', 
pv2.price AS 'Discount' 
FROM 
pricevalues pv1, pricevalues pv2 
WHERE 
pv1.priceindex = 'SPOT_INDEX_ID' AND 
pv1.pricedate = pv2.pricedate AND 
pv2.priceindex = 'DISCOUNT_INDEX_ID' 

這當然不可能這些巨大的差距我n的折扣指數,所以當日期不匹配時,我該如何取得最新折扣價的

編輯:我想輸出到如下所示:

PRICEDATE  SPOT_INDEX   DISCOUNT_INDEX  SPOT_PRICE  
---------------- ------------------- --------------------- ----------- --->>> 
    2013-07-26 | SPOT_INDEX_ID | DISCOUNT_INDEX_ID | 358.5 | 

DISCOUNT_PRICE  TOTAL_PRICE    
---------------- ------------------- 
     16.0  |  342.5  | 
+0

你能展示一個你想從這個查詢返回的輸出樣本嗎?另外,是否有現貨指數的日常條目? –

+0

我已經添加了一個示例輸出。每週5天(週一至週五)將新條目添加到現貨索引中。折扣索引條目將不定期添加。 – KHH

回答

0

我解決了這個問題,在Excel中獲取的SQL和處理這樣的組合,我也照顧的間隙在打折指數。

0

您可以採取的折扣價格在一個變量對於給定的日期,然後在主查詢中使用它。這裏是示例:

Declare @Discount_Price money 
select Max(pricedate),@Discount_Price=Price from pricevalues where PriceIndex='DISCOUNT_INDEX_ID' group by Price having Price=Max(PriceDate)  
SELECT 
    (pv1.price - @Discount_Price) AS PriceDiff, 
    pv1.price AS 'Spot Price', 
    @Discount_Price AS 'Discount' 
FROM 
    pricevalues pv1 
WHERE 
    pv1.priceindex = 'SPOT_INDEX_ID' 
+0

雖然這適用於絕對最新的給定折扣,但我需要能夠找到當場的最新折扣*相對*。如果我在2013-03-01有一個點,在2013-03-02的折扣是**無效**,因爲它不是最新的相對位置。另一方面,在2013年2月29日的折扣將是有效的 - 當然,如果距離2013-03-01(過去)更近還沒有其他折扣。 – KHH

0

如果你只想要返回一條記錄,這將工作:

DECLARE @date DATE = GETDATE() 
SELECT TOP 1 a.PRICEDATE, b.PRICE 'Spot', a.PRICE 'Discount', b.Price - a.Price 'Total' 
FROM #Table1 a 
JOIN (SELECT *,ROW_NUMBER() OVER (PARTITION BY PRICEINDEX ORDER BY PRICEDATE DESC)'RowRank' 
     FROM #Table1 
     WHERE PRICEINDEX = 'SPOT_INDEX_ID' 
      AND PRICEDATE <= @date 
    )b   
    ON b.RowRank = 1 
WHERE a.PRICEINDEX = 'DISCOUNT_INDEX_ID' 
     AND a.PRICEDATE <= @date 
ORDER BY a.PRICEDATE DESC 

變化GETDATE()到任何您查詢日期。

我不確定你想要什麼PRICEDATE,也許應該是b.PRICEDATE,或者只是@date

+0

有沒有辦法修改它,所以它是一個日期範圍的函數並返回一個表?假設我想要2012-2013年的所有日期的總價格。 – KHH