如何在SQL Server中获得截然不同的最近日期?

时间:2015-09-01 07:58:59

标签: 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  
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  

我有一个日期,我需要检索最近日期的记录,并且只有那些,例如,如果09/24/2011是输入,输出应该只是23日的记录项目A,第22项为itemB,第21项为itemC。

使用SQL Server 2012。

3 个答案:

答案 0 :(得分:4)

一种方法是使用datediff计算行数据与给定日期之间的差异,相应地为每行分配rank并按其过滤。

我在这里使用?作为所需日期的占位符,只需使用您正在使用的语言的正确语法进行切换:

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

答案 1 :(得分:2)

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
(10 row(s) affected)
Item       price                                   priceDate
---------- --------------------------------------- ----------
ItemA      801.36                                  2011-09-23
ItemA      800.64                                  2011-09-23
ItemB      4701.36                                 2011-09-22
ItemB      1101.36                                 2011-09-22
ItemB      401.36                                  2011-09-22
ItemC      9601.36                                 2011-09-21

答案 2 :(得分:-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;
      }
    }
  }
}