2016-09-28 66 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 
相关问题