如何通过加入获得最后一个MAX日期的下一个

时间:2016-09-28 01:49:40

标签: sql sql-server sql-server-2012

我正在使用MS SQL进行查询,以显示我们"服务中心内的项目"在过去30天内不止一次。所需数据来自最近服务订单之前的服务订单,基于序列号。因此,如果在过去30天内收到了某个项目,请检查过去30天内是否收到该项目。

ServiceOrders表:CustIDItemIDDateReceived
ItemMaster表:CustIDItemIDSerialNumber

我可以使用

获取DateReceived项目
ServiceOrders.DateReceived >= DATEADD(month,-1,GETDATE())

我可以将过去一个月的服务订单加载到临时表中,然后对其进行查询以获取先前的服务订单,但这听起来并不像最佳计划。有关获得以前服务订单的有效方法的任何想法?

示例数据
    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是关键。

3 个答案:

答案 0 :(得分:2)

将上个月的订单过滤到公用表表达式中,并将其编号为降序。然后在cte2中选择出现次数超过1的项目,加入cte' s选择第二行。

;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

答案 1 :(得分:0)

  1. <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script> <span class="language"> <a href="#"> ENG </a> <i class="fa fa-caret-down" aria-hidden="true"></i> </span> <ul class="languageDropdown"> <li> <a href="#"> ABC </a> </li> <li> <a href="#"> ENGLISH </a> </li> <li> <a href="#"> SPANISH </a> </li> <li> <a href="#"> ARABIC </a> </li> <li> <a href="#"> TELUGU </a> </li> </ul>

  2. 粘贴到Excel

  3. 过滤最后一列以显示结果=或&gt;比2

  4. 可能是您的快速解决方案。

答案 2 :(得分:0)

获取过去30天内收到的物品不止一次。然后使用import rpy2.robjects as ro ro.r('invlogit <- function(x){ + exp(x)/(1 + exp(x)) }') p = ro.r('curve(invlogit({0} + {1}*x), add = TRUE)'.format(a,b)) 根据date_received的降序对行进行编号。最后,获取row_number为2的行(最近30天内最后一个日期之前的日期)。

如果输出中需要serialnumber,只需将row_number itemmaster表添加到最终结果集。

join