1

我正在构建一个 SQL 查询,该查询可用于获取有效日期介于给定开始/结束日期时间之间的记录,并捕获有效日期永远有效,直到有另一条具有不同有效日期的记录。例如,我正在显示一个价格表,其中产品价格基于特定日期有效

ProductID    EffectiveDate   Price
  Milk         01/01/2012     3
  Milk         02/01/2012     2.85
  Milk         03/01/2012     3.1
  Milk         03/15/2012     3.4
  Milk         04/01/2012     3.2

如果我的开始/结束日期时间是 03/01 和 03/31,那么我想要日期为 03/01 和 03/15 的记录,但如果我的开始/结束日期是 03/20 和 03/31,那么我只需要获取记录 03/15 我的查询有效,但是我正在尝试查看是否有一种非常有效的方法来获得所需的结果。

SELECT productid, 
       effectivedate, 
       price 
FROM   product p 
WHERE  ( p.effectivedate >= '03/20/2012' 
         AND c.effectivedate <= '03/31/2012' ) 
        OR p.effectivedate = (SELECT TOP 1 pp.[effectivedate] 
                              FROM   product pp 
                              WHERE  pp.effectivedate <= '03/20/2012' 
                                     AND pp.productid = p.productid 
                              ORDER  BY pp.effectivedate DESC) 

我希望改进的原因是表格可以变得更大,我只是在这里展示一个示例作为产品,但是最终表格有更多的列。

感谢您的任何建议。

4

2 回答 2

0

像这样的东西应该工作:

select somefields, max(effectivedate) maxdate
from product
where effectivedate >= @startdate
and effectivedate < @TheDayAfterEndDate
and not exists
(select *
from product
where effectivedate > @EndDate)
group by somefields
于 2013-04-01T19:05:46.537 回答
0

对于这样的结构,我认为最好添加结束日期,然后从那里开始工作:

with BetterDataStructure as (
      select p.*,
             (select min(p2.EffectiveDate) from product p2 where p2.productId = p.productId and p2.EffectiveDate > p.EffectiveDate
             ) as EndDate
      from product p
     )
select *
from BetterDataStructure bds
where bds.startDate <= '2012-03-31' and
      (bds.endDate > '2013-03-01' or bds.endDate is NULL);

如果您使用的是 SQL Server 2012,则可以使用该lead()函数而不是相关子查询。

于 2013-04-01T19:06:33.707 回答