2013-10-05 63 views
1

我正在嘗試製作從給定表中獲取最低最近日期的最大價格的過程。從sql server中的最短日期獲取最大價格

在過程中,我只能通過MaterialNo和Date,基於此我想要最近的最低月份的最高價格。

步驟

Declare @MaterialNo numeric(18,0), 
     @PassDate smalldatetime, 

set @MaterialNo = 3 
set @PassDate = '01-jun-2013' 

Select Statement (i need This Statement) 

Where MaterialNo = @MaterialNo 

我的表結構是像下面

臨時表

MaterialNo Date    Price 
1   May, 01 2013  28 
1   June, 01 2013  25 
1   June, 01 2013  30 
1   August, 01 2013  35 
2   November, 01 2013 40 
2   November, 01 2013 50 
2   May, 05 2013  15 
3   July, 01 2013  14 
3   August, 01 2013  20 
3   December, 01 2012 12 

的預期輸出,

如果我通過@MaterialNo 1@PassDate = '30-Jun-2013'輸出= 30

如果我通過@MaterialNo 1@PassDate = '30-Jul-2013'輸出= 30

如果我通過@MaterialNo 1@PassDate = '30-Aug-2013'輸出= 35

如果我通過@MaterialNo 1@PassDate = '30-May-2013'輸出= 28

如果我通過@MaterialNo 2@PassDate = '30-Nov-2013'輸出= 50

如果我通過@MaterialNo 2@PassDate = '30-Aug-2013'輸出= 15

如果我通過@MaterialNo 3@PassDate = '15-Dec-2013'輸出= 12

如果我通過@MaterialNo 3@PassDate = '10-Nov-2013'輸出= 20

如果我通過@MaterialNo 3@PassDate = '20-Sep-2013'輸出= 20

如果我通過@MaterialNo 3@PassDate = '30-Jul-2013'輸出= 14

SQLFiddle

回答

3

我會用以下SELECT聲明:

SELECT TOP 1 Price 
FROM TempTable 
WHERE 
    MaterialNo = @MaterialNo 
    AND @PassDate >= Date 
ORDER BY Date DESC, Price DESC 

我通過Date排序,然後通過Price DESC處理條件那裏是MaterialNoDate(即MaterialNo = 1,Date = '01-Jun-2013')的重複條目。

1

您所查詢的是:

declare @materialNo int = 3 
declare @date date = '10-Nov-2013' 

Select max(Price) from TempTable 
where MaterialNo = @materialNo 
and [Date] = (select max(T.[Date]) from TempTable T where T.[Date] < @date 
     and T.MaterialNo = TempTable.MaterialNo) 

這實在是很簡單:選定的日期是參數日期爲給定材料之前的最大。然後,您可以獲得該日期的最高價格。

感謝您使用SQL小提琴!你的腳本有,雖然一個錯誤,最後插入應該有:

Insert Into TempTable Values(3,'01-Dec-2013',12) -- it had wrong year 
+0

感謝哥們,你的質疑絕對是正確的,但是,rsbarro的查詢更簡單和優化... –

+0

不用擔心,我同意。 – Szymon

相關問題