2016-09-28 50 views
0

我正在處理MS SQL中的查詢以顯示最近30天內在我們的「服務中心」中多次出現的項目。所需數據來自最近的服務訂單之前的服務訂單,基於序列號。因此,如果在過去30天內收到了某件商品,請檢查它是否在過去30天內的前一次收到。如何在加入之前獲取上一個MAX日期

ServiceOrders表:CustIDItemIDDateReceived
ItemMaster表:CustIDItemIDSerialNumber

我可以用

ServiceOrders.DateReceived >= DATEADD(month,-1,GETDATE()) 

我可以從過去的一個月中加載的服務訂單到拿到DateReceived項目一個臨時表,然後根據它來查詢以獲得先前的服務訂單,但這聽起來不像是最好的計劃。任何有效的方式來獲得以前的服務訂單的想法?

實施例數據
ServiceOrders表:

CustID ItemID DateReceived 
1  2  9/26/2016 
1  2  9/05/2016 
1  2  1/15/2015 
5  6  9/20/2016 
7  6  9/02/2016 

ItemMaster表:

CustID ItemID SerialNumber 
1  2  8675309 
5  6  101 
7  6  101 

因此,在上述例子中,的SerialNumber 8675309和101已經接收到一次以上,在過去30天。我需要來自ServiceOrders和ItemMaster的DateReceived 9/05/2016和09/02/2016記錄(30天內的第二個最近的記錄)的數據。這兩個表中還有其他字段,但在這裏簡化了。由於物品可以被轉移,因此CustID不一定會始終保持不變。 SerialNumber是關鍵。

+2

發佈足夠的樣本數據來說明您的任務和期望的結果。 –

+1

我同意PM 77-1。如果您可以發佈一些示例數據以顯示您真的以後是什麼,這將非常有幫助。 – Connor

+0

添加了示例數據和標籤。 –

回答

2

將上個月的訂單過濾爲通用表表達式並將其編號遞減。然後選擇那些出現次數超過1的項目放入cte2中,同時加入cte選擇第二行。

;With cte as(
    Select row_number() over(PARTITION by ItemID order by DateReceived desc) as RowNum, * 
from ServiceOrders 
where DateReceived >= DateAdd(Month, -1, Getdate()) 
), cte2 as(
    Select 
    ItemID From cte 
    Group by ItemID 
    Having count(*)>1 
) 
select b.*, c.SerialNumber from cte2 as a 
left join cte as b on a.ItemID= b.ItemID and b.RowNum=2 
left join ItemMaster as c on b.ItemID=c.ItemID and b.CustID=c.CustID 
0
  1. SELECT *, COUNT(ServiceOrders.DateReceived) as DateCount FROM TABLE

  2. 粘貼到Excel

  3. 篩選最後一欄顯示的結果=或>大於2

可能是你一個快速的解決方案。

0

獲取在過去30天內多次收到的物品。然後使用row_number根據date_received的降序對行進行編號。最後,獲取row_number爲2的行(過去30天中最近日期之前的日期)。

如果在輸出中需要serialnumber,只需要join itemmaster表到最終結果集。

WITH morethanone 
AS (SELECT 
    so.itemid 
FROM serviceorders so 
JOIN itemmaster i 
    ON i.itemid = so.itemid 
GROUP BY so.itemid 
HAVING COUNT(CASE WHEN DATEDIFF(dd, so.datereceived, GETDATE()) <= 30 THEN 1 END)>1 
) 
SELECT 
    custid, 
    itemid, 
    datereceived 
FROM (SELECT 
    *, 
    ROW_NUMBER() OVER (PARTITION BY itemid ORDER BY datereceived DESC) rn 
FROM serviceorders 
WHERE itemid IN (SELECT itemid FROM morethanone) 
AND DATEDIFF(dd, datereceived, GETDATE()) <= 30 
) x 
WHERE rn = 2 
相關問題