Sql距离今天最近2天

时间:2015-08-03 08:04:56

标签: sql-server date closest getdate

我有一个Product表,我将其加入OrderTracking

产品

  • 产品代码
  • 产品名称
  • ManufacturerCode
  • 价格
  • 等等...

订货信息

  • 产品代码
  • 订单ID
  • ammount的
  • DeliveryDate
  • ShippingNumber
  • 等等...
SELECT Product.ProductCode,

 FROM Product LEFT OUTER JOIN OrderTracking
    ON Product.ProductCode=OrderTracking.ProductCode

 GROUP BY ProductCode

我的OrderTracking表中有过去和将来的产品订单信息。 我的目标是如果有一个产品的未来订单我想在同一行中列出其中的前2个(最接近2个订单到今天)。如果将来没有订单,列将为null,或者如果将来只有一个订单,则第二列将为null。示例行将是这样的:

  • ProductCode

  • 1stClosestDeliveryDate

  • 1stClosestOrderAmount
  • 1stShippingNumber
  • 2ndClosestDeliveryDate
  • 2ndClosestOrderAmount
  • 2ndShippingNumber

       SELECT Product.ProductCode, 1stClosestDeliveryDate,1tClosestOrderAmount,
         1stShippingNumber,2stClosestOrderDate, 2stClosestDeliveryAmount,  
       2stShippingNumber
       FROM Product LEFT OUTER JOIN OrderTracking 
       ON Product.ProductCode = OrderTracking.ProductCode
       GROUP BY Product.ProductCode
    

    我应该使用GETDATE()函数并与其他日期值进行比较,但我无法弄清楚如何从OrderTracking表中获取这些值。任何帮助将不胜感激...

1 个答案:

答案 0 :(得分:1)

ROW_NUMBER使用CTE

WITH orders AS
(
 SELECT ROW_NUMBER() OVER (PARTITION BY ProductCode ORDER BY OrderDate ASC) AS RNumber
       , ProductCode
       , OrderDate
       , OrderAmount
       , OrderShippingNumber
 FROM OrderTracking
 WHERE OrderDate > GETDATE()
)
SELECT Product.ProductCode
       , 1stClosestOrderDate = O1.OrderDate
       , 1tClosestOrderAmount = O1.OrderAmount
       , 1stShippingNumber = O1.OrderShippingNumber
       , 2stClosestOrderDate = O2.OrderDate
       , 2stClosestOrderAmount = O2.OrderAmount
       , 2stShippingNumber = O2.OrderShippingNumber
FROM Product
       LEFT OUTER JOIN orders AS O1 ON Product.ProductCode = O1.ProductCode AND O1.RNumber = 1
       LEFT OUTER JOIN orders AS O2 ON Product.ProductCode = O2.ProductCode AND O2.RNumber = 2;

在你发布的结构中有一些列丢失,所以我猜到了一些名字,但上面应该是获得最终结果的起点。

第一个SELECTCTE)收集有关按产品添加行号的订单的数据:行号= 1的行是该产品的下一个订单,而数字= 2的行是第二个下一个订单。

第二个SELECT可以加入表& CTE获取所需的输出。

警告CTE语法要求前一个语句(如果有)由;终止。由于结束分号不是强制性的,因此在具有多个语句的脚本中运行整个语句时,很容易忘记它并出现语法错误。