如何在SQL Server中获取不同的最近日期?

如何在SQL Server中获取不同的最近日期?,sql,sql-server,select,sql-server-2012,Sql,Sql Server,Select,Sql Server 2012,我不知道怎么格式化?!,但我相信这很容易理解。 我有下表,我们称之为销售 |Item| |Price| |PriceDate| ItemA 801.36 09/23/2011 ItemA 800.64 09/23/2011 ItemA 803.55 09/22/2011 ItemB 4701.36 09/22/2011

我不知道怎么格式化?!,但我相信这很容易理解。 我有下表,我们称之为销售

|Item|        |Price|        |PriceDate|  
ItemA          801.36         09/23/2011  
ItemA          800.64         09/23/2011  
ItemA          803.55         09/22/2011  
ItemB          4701.36         09/22/2011  
ItemB          1101.36         09/22/2011  
ItemB          4801.36         09/20/2011  
ItemB          401.36         09/22/2011    
ItemC          9601.36         09/21/2011  
ItemC          201.36         09/19/2011  
ItemC          301.36         09/17/2011  
给我一个日期,我需要检索最接近日期的记录,并且只检索那些记录,例如,如果2011年9月24日是输入,那么输出应该仅是第23个项目a、第22个项目B和第21个项目C的记录

使用SQL Server 2012

DECLARE @theTable TABLE (Item VARCHAR(10), price DECIMAL(10,2), priceDate DATE)
INSERT @theTable ( Item, price, priceDate )
VALUES  
('ItemA',801.36,'2011-09-23'),
('ItemA',800.64,'2011-09-23'),
('ItemA',803.55,'2011-09-22'),
('ItemB',4701.36,'2011-09-22'),
('ItemB',1101.36,'2011-09-22'),
('ItemB',4801.36,'2011-09-20'),
('ItemB',401.36,'2011-09-22'),
('ItemC',9601.36,'2011-09-21'),
('ItemC',201.36,'2011-09-19'),
('ItemC',301.36,'2011-09-17')

DECLARE @inputDate DATE
SET @inputDate = '2011-09-24'

SELECT X.Item, X.price, X.priceDate FROM (
SELECT TT.Item, TT.price, TT.priceDate, 
       RANK() OVER (PARTITION BY [Item] 
                          ORDER BY ABS(DATEDIFF(DAY, @inputDate, TT.priceDate))) AS RN
FROM @theTable TT 
) AS X
WHERE RN = 1

其中一种方法是使用计算行数据与给定日期之间的差异,为每行相应地分配一个值,并根据该值进行过滤

我用的是什么?作为所需日期的占位符,只需使用所用语言的正确语法进行切换:

SELECT item, price, pricedate
FROM   (SELECT item, price, pricedate,
               RANK() OVER (PARTITION BY item
                            ORDER BY ABS(DATEDIFF(day, pricedate, ?))) AS rk
        FROM   salse) t
WHERE  rk = 1

其中一种方法是使用计算行数据与给定日期之间的差异,为每行相应地分配一个值,并根据该值进行过滤

我用的是什么?作为所需日期的占位符,只需使用所用语言的正确语法进行切换:

SELECT item, price, pricedate
FROM   (SELECT item, price, pricedate,
               RANK() OVER (PARTITION BY item
                            ORDER BY ABS(DATEDIFF(day, pricedate, ?))) AS rk
        FROM   salse) t
WHERE  rk = 1

我也有同样的问题,但我发现我可以用更简单的方法在前端解决它

/*back end*/
/*(DistinctItem)   select distinct Item from sales*/
/*(saleRecords)    select * from sales order by PriceDate desc*/

/*front end*/
for(var j = 0; j < DistinctItem.length;j++){
  for(var i = 0; i < saleRecords.length;i++){
    if(DistinctItem[j].Item==saleRecords[i].Item){
      if(anyDate>saleRecords[i].PriceDate){
        use saleRecords[i];
        break;
      }
    }
  }
}

我也有同样的问题,但我发现我可以用更简单的方法在前端解决它

/*back end*/
/*(DistinctItem)   select distinct Item from sales*/
/*(saleRecords)    select * from sales order by PriceDate desc*/

/*front end*/
for(var j = 0; j < DistinctItem.length;j++){
  for(var i = 0; i < saleRecords.length;i++){
    if(DistinctItem[j].Item==saleRecords[i].Item){
      if(anyDate>saleRecords[i].PriceDate){
        use saleRecords[i];
        break;
      }
    }
  }
}

您采取了哪些步骤试图自己解决这个问题?您如何定义最近的问题?它是在输入日期之前还是之后,或者两者都是?我尝试使用rank函数,但是失败了,我真的是SQL Server的新手。我像输入日期之前一样定义了最近距离您采取了哪些步骤来尝试自己解决这个问题?您如何定义最近距离?它是在输入日期之前还是之后,或者两者都是?我尝试使用rank函数,但是失败了,我真的是SQL Server的新手。我定义了最接近输入数据的函数,即我所使用的秩加窗函数将在1天前和1天后被认为是相等的,并且将返回它们。”RossPresser通过OP的描述,这似乎是正确的行为——它们都是给定日期的一个DAT。还是我遗漏了什么?不,你一点也没遗漏。我的笔记并不意味着暗示OP,这可能不是你们想要的,只是不要对此感到惊讶。注意到我使用的秩窗口函数将在1天前和1天后被认为是相等的,并且将返回它们。”RossPresser通过OP的描述,这似乎是正确的行为-他们都离给定日期一天。还是我遗漏了什么?不,你一点也没遗漏。我的说明并不意味着向OP暗示这可能不是你想要的,只是不要对此感到惊讶。Hi-Cheuk,请将代码作为文本,而不是图像。Hi-Cheuk,请将代码作为文本,而不是图像