2013-05-01 51 views
2

表格包含PriceValidFrom,PriceValidTo,BookingWindowFrom和BookingWindowTo日期字段和Price貨幣字段。客戶端隨機插入或更新行。例如,某些行的PriceValid週期可能比其他行短,但可能在同一個月內(並且價格不同)。其他行可能具有相同的PriceValid週期,但僅可能在BookingWindow期間有所不同。桌子從不清理,一切都可以接受。 我需要一個查詢,給定日期,將返回具有最高PriceValidFrom日期的行中的價格。在下面的例子中,考慮到表和查詢語句:使用兩個不同日期選擇最上一行

PriceValidFrom PriceValidTo Price 
05/01/2013  05/30/2013 $100.00 
05/15/2013  05/20/2013 $50.00 

僞SQL

select top 1 price 
where :Date between PriceValidFrom and PriceValidTo 
order by PriceValidFrom DESC, Price 

如果日期是2013年5月16日該查詢返回$ 50.00預期。

現在,用戶需要添加一個預訂窗口時期,還必須採取最高BookingWindowFrom:

PriceValidFrom PriceValidTo Price  BookingWindowFrom BookingWindowTo 
05/01/2013  05/30/2013 $100.00 4/1/2013   5/30/2013 
05/15/2013  05/20/2013 $50.00 4/1/2013   5/30/2013 
05/15/2013  05/20/2013 $75.00 5/1/2013   5/30/2013 

現在,如果日期是2013年5月16日和預約日期爲5/1/2013查詢需要返回$ 75.00

如何完成預期的結果?請注意,這是一個簡化的例子,但實際表格中會有數百行。

select top 1 price 
where :Date between PriceValidFrom and PriceValidTo  
    and :BookingDate between BookingWindowFrom and BookingWindowTo 
+0

什麼有效日期ovverides?有效? – 2013-05-01 14:58:34

+0

有些描述或示例數據顯示當有效日期存在和不存在時要執行的操作會有所幫助。 – 2013-05-01 15:00:45

+0

我已更新我的帖子。請再看看它。謝謝 – 2013-05-01 23:14:49

回答

1

ORDER BY是解決不了問題,你必須改變你的WHERE條款。例如:

SELECT top 1 price  
WHERE EffectiveDate = :pDate 
    OR (EffectiveDate IS NULL AND :pDate BETWEEN ValidFrom AND ValidTo) 

ORDER BY EffectiveDate DESC, ValidFrom DESC, Price 

我假設你在這裏有一些關於你的模式的東西,但我認爲這應該有助於你開始。

1

這是基於猜測時我如何認爲你想使用EFFECTIVEDATE:

select top 1 price 
where :pDate between coalesce(EffectiveDate, ValidFrom) and ValidTo 
order by coalesce(EffectiveDate, ValidFrom) DESC, Price 

還是你想簡單地折騰了,如果有可用的所有EFFECTIVEDATE日期ValidXXX?

我通常會建議使用最小/最大或排名函數來獲得價格,而不是巧妙地使用order子句操作非ANSI top,但這只是一個意見。

我必須承認,這個EffectiveDate乍一看似乎有點駭人聽聞,以便無法正確清理ValidFrom/To日期,例如「我們不想花時間來糾正我們的數據,只是讓事情這個價格吧!「因此,什麼是阻止EffectiveDates變得太多,使得它看起來像你需要添加一個ReallyEffectiveDate列? 「有效」和「有效」這兩個詞在這裏看起來就像是同義詞,可能會讓人很難理解和反對。好吧,充滿假設的咆哮。

+0

你的假設是100%正確的。我已更新我的帖子,請再看一下。謝謝。 – 2013-05-01 23:15:51

相關問題