我在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
答案 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
函数来识别每个项目的关键日期,逐个记录,然后您进行汇总测试以提取您的匹配记录或你的默认记录。