Sql 距今天最近 2 天

Sql Closest 2 Days to Today

我有一个 Product table 我加入了 OrderTracking table

产品

订单追踪


SELECT Product.ProductCode,

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

 GROUP BY ProductCode

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

使用 CTEROW_NUMBER:

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;

在您 post 的结构中缺少一些列,所以我猜到了一些名称,但以上应该是获得最终结果的起点。

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

第二个 SELECT 加入 table & CTE 以获得所需的输出。

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