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 个订单)。如果将来没有订单,则列将为空,或者如果将来只有一个订单,则第二列将为空。示例行将是这样的:
产品代码
1stClosestDeliveryDate
- 1stClosestOrderAmount
- 第一个发货编号
- 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 table 中获取这些值。任何帮助将不胜感激...
使用 CTE
和 ROW_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 的结构中缺少一些列,所以我猜到了一些名称,但以上应该是获得最终结果的起点。
第一个SELECT
(CTE
)收集有关按产品添加行号的订单的数据:行号= 1的行是该产品的下一个订单,行号= 2个是下一个订单。
第二个 SELECT
加入 table & CTE
以获得所需的输出。
警告:CTE
语法要求前面的语句(如果有的话)以;
结束。由于结束分号不是强制性的,因此当 运行 包含多个语句的脚本中的整个语句时,很容易忘记它并出现语法错误。
我有一个 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 个订单)。如果将来没有订单,则列将为空,或者如果将来只有一个订单,则第二列将为空。示例行将是这样的:
产品代码
1stClosestDeliveryDate
- 1stClosestOrderAmount
- 第一个发货编号
- 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 table 中获取这些值。任何帮助将不胜感激...
使用 CTE
和 ROW_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 的结构中缺少一些列,所以我猜到了一些名称,但以上应该是获得最终结果的起点。
第一个SELECT
(CTE
)收集有关按产品添加行号的订单的数据:行号= 1的行是该产品的下一个订单,行号= 2个是下一个订单。
第二个 SELECT
加入 table & CTE
以获得所需的输出。
警告:CTE
语法要求前面的语句(如果有的话)以;
结束。由于结束分号不是强制性的,因此当 运行 包含多个语句的脚本中的整个语句时,很容易忘记它并出现语法错误。