簡體   English   中英

如何在 SQL Server 中獲得不同的最近日期?

[英]How to get distinct closest date in SQL Server?

我不知道如何格式化?!但我相信它很容易理解。 我有下表,我們稱之為“銷售”

|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 是輸入,則輸出應該只是項目 A 的第 23 條記錄,第 22 條為 itemB 和 21st 為 itemC。

使用 SQL Server 2012。

一種方法是使用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
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

我有同樣的問題,但我發現我可以通過更簡單的方式在前端解決它

/*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;
      }
    }
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM