2013-08-19 43 views
0

我有銷售交易在SQL Server表是這樣的:找到最後的價格是從目前的價格不同

ItemNumber, TrxDate, UnitPrice 
ABC, 1/1/2013, 10.00 
ABC, 2/1/2013, 10.00 
ABC, 3/1/2013, 13.00 
ABC, 4/1/2013, 14.00 
ABC, 5/1/2013, 14.00 
XYZ, 1/1/2013, 18.00 
XYZ, 2/1/2013, 18.00 
XYZ, 3/1/2013, 20.00 
XYZ, 4/1/2013, 20.00 
XYZ, 5/1/2013, 20.00 

我需要一個存儲過程來產生輸出看起來像這樣

ItemNumber, LastPrice, PriorPrice 
ABC, 14.00, 13.00 
XYZ, 20.00, 18.00 
+0

您正在使用哪個版本的SQL Server? –

+0

'LastPrice'和'PriorPrice'相對於什麼? –

回答

0

您可以使用lag()功能首先發現做到這一點,當價格變動:

select ItemNumber, 
     max(case when seqnum = 1 then Price end) as LastPrice, 
     max(case when seqnum = 2 then Price end) as PriorPrice 
from (select t.*, row_number() over (partition by ItemNumber order by TrxDate desc) as seqnum 
     from (select t.*, 
        lag(Price) over (partition by ItemNumber order by TrxDate) as PrevPrice 
      from t 
      ) t 
     where Price <> PrevPrice or PrevPrice is NULL 
    ) t 
group by ItemNumber; 

時滯僅開始可用SQL Server 2012的

如果沒有lag(),則可以做同樣的事情用一個相關子查詢:

select ItemNumber, 
     max(case when seqnum = 1 then Price end) as LastPrice, 
     max(case when seqnum = 2 then Price end) as PriorPrice 
from (select t.*, row_number() over (partition by ItemNumber order by TrxDate) as seqnum 
     from (select t.*, 
        (select top 1 t2.Price 
        from t t2 
        where t.ItemNumber = t2.ItemNumber and 
          t.TrxDate > t2.TrxDate 
        order by t2.TrxDate desc 
        ) as PrevPrice 
      from t 
      ) t 
     where Price <> PrevPrice or PrevPrice is NULL 
    ) t 
group by ItemNumber; 
+0

感謝戈登這似乎在做伎倆 –

+0

有一件事,我不得不改變,這就是語句的文本是「由TrxDate ItemNumber順序分區」我不得不改變爲「通過TrxDate desc ItemNumber順序分區」 。 –

0

Assmunig的SQL Server 2005+:

;WITH CTE AS 
(
    SELECT *, 
      RN=ROW_NUMBER() OVER(PARTITION BY ItemNumber ORDER BY TrxDate DESC) 
    FROM ( SELECT ItemNumber, 
        MAX(TrxDate) TrxDate, 
        UnitPrice 
      FROM YourTable 
      GROUP BY ItemNumber, 
        UnitPrice) A 
) 
SELECT ItemNumber, 
     MIN(CASE WHEN RN = 1 THEN UnitPrice END) LastPrice, 
     MIN(CASE WHEN RN = 2 THEN UnitPrice END) PriorPrice 
FROM CTE 
GROUP BY ItemNumber 
+0

。 。這非常聰明,它*確實回答了這個問題。但是,如果有先前的先期價格,則不一定有效。問題是相同的價格可能會重複多次 - 至少在理論上 - 所以先前的價格可能是最近的價格。 –

+0

@GordonLinoff是的,你是對的,甚至沒有想到這一點。希望op只需要最後和先前的價格,否則我的答案將無法正常工作 – Lamak

相關問題