2013-05-01 64 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