SQL查找最近的日期而不会过去,或返回最旧的记录

时间:2016-05-17 21:02:28

标签: sql sql-server

我在SQL Server中有一个视图,其中包含项目的价格。我的用户将传递一个日期变量,我想返回最接近的记录而不会过去,或者如果不存在这样的记录,则返回最旧的记录。例如,对于下面的数据,如果用户通过4月的项目A,它将返回3月记录,对于项目B,它将返回6月记录。

我已尝试使用Union All和Order by进行了大量修改,但仍然遇到各种错误。有没有办法用Case Statement来写这个?

示例:

case when min(Month)>Input Date then min(Month) 
else max(Month) where Month <= Input Date?

将样本数据集作为图像附加的真诚道歉,否则我无法正确格式化。 Sample Dataset

2 个答案:

答案 0 :(得分:0)

您可以使用SELECT TOP(1)和DATE DESC +项目类型+日期比较的订单来获取最新信息。 ORDER BY将按日期订购记录,然后您将在本月(如果存在)或更早的月份获得最新信息。

答案 1 :(得分:0)

这是一个查询的粗略轮廓(没有更多的表格,很难准确):

  WITH CTE AS
  (
  SELECT
    ITEM,
    PRICE,
    MIN(ACTUAL_DATE) OVER (PARTITION BY ITEM ORDER BY ITEM) AS MIN_DATE,
    MAX(INPUT_DATE<=ACTUAL_DATE) OVER (PARTITION BY ITEM ORDER BY ITEM,ACTUAL_DATE) AS MATCHED_DATE
  FROM TABLE
  )
SELECT
  CTE.ITEM,
  CTE.PRICE,
  CASE 
    WHEN
      CTE.MATCHED_DATE IS NOT NULL
    THEN 
      CTE.MATCHED_DATE
    ELSE
      CTE.MIN_DATE
    END AS MOSTLY_MATCHED_DATE
FROM CTE
GROUP BY 
  CTE.ITEM, 
  CTE.PRICE

这个想法是,在公用表表达式中,您使用PARTITION BY函数来识别每个项目的关键日期,逐个记录,然后您进行汇总测试以提取您的匹配记录或你的默认记录。