我不知道如何格式化?!,但我相信它很容易理解。 我有下表,我们称之为“销售”
|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。
答案 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;
}
}
}
}