【问题标题】:Query to return amount of orders of a specific Product ID before and after the current order查询返回当前订单前后特定Product ID的订单数量
【发布时间】:2021-10-10 21:21:35
【问题描述】:

我有一个包含两列的表:OrderIdProductId,我需要一个查询来显示这两列并添加另外两列,其中一列会告诉我这个特定 ProductId 的订单数来之前这个订单(orderIds 是按升序创建的),另一列会告诉我这个特定项目有多少订单来了之后这个订单。

所以,例如,这应该是结果:

OrderId ProductId OrdersBefore OrdersAfter
245 PR-987 0 2
246 GH-764 0 1
247 NV-102 0 0
248 PR-987 1 1
249 PR-987 2 0
250 GH-764 1 0

我一直在摆弄再次将表添加为连接,尝试将其作为子查询,以及各种其他可能的方法,但它要么根本不起作用,要么无休止地继续下去,要么返回错误的结果。所以我基本上被困住了,如果有任何帮助或指导,我将不胜感激。

这是我尝试过的两种方法(其他的我不记得了,因为我尝试了很多方法的多次迭代),都没有完成查询:

1.

SELECT OrderId
     , ProductId
     , (
           SELECT COUNT(*)
           FROM Orders o2
           WHERE o2.ID < Orders.ID
               AND ProductID = ProductID
       )
       OrdersBefore
     , (
           SELECT COUNT(*)
           FROM Orders o2
           WHERE o2.ID > Orders.ID
               AND ProductID = ProductID
       )
       OrdersAfter
FROM Orders
SELECT o.OrderId
     , o.ProductId
     , COUNT(DISTINCT before.ID) OrdersBefore
     , COUNT(DISTINCT after.ID) OrdersAfter
FROM Orders o
    LEFT JOIN Orders before ON before.ProductId = o.ProductId
            AND before.OrderId< o.OrderId
    LEFT JOIN Orders after ON after.ProductId = o.ProductId
            AND after.OrderId> o.OrderId
GROUP BY o.OrderId
       , o.ProductId

【问题讨论】:

  • 根据问题指南,请展示您尝试过的内容并告诉我们您发现了什么(在本网站或其他地方)以及为什么它不能满足您的需求。还显示将产生所需结果的示例数据。
  • 提示 - count over

标签: sql sql-server tsql join


【解决方案1】:

您可以使用row_number()。假设orderid 是您定义订单顺序的方式:

select t.*,
       row_number() over (partition by productid order by orderid) - 1 as orders_before,
       row_number() over (partition by productid order by orderid desc) - 1 as orders_after
from t;

【讨论】:

    【解决方案2】:

    您可以使用带窗口的COUNT OVER

    SELECT
      OrderId,
      ProductId,
      OrdersBefore = COUNT(*) OVER (PARTITION BY t.ProductId ORDER BY t.OrderId ROWS UNBOUNDED PRECEDING),
      OrdersAfter = COUNT(*) OVER (PARTITION BY t.ProductId ORDER BY t.OrderId ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING)
    FROM YourTable t
    

    【讨论】:

    • 抱歉已修复
    猜你喜欢
    • 2020-05-08
    • 2020-03-18
    • 2017-07-02
    • 2021-08-31
    • 2019-08-23
    • 2018-11-20
    • 1970-01-01
    • 1970-01-01
    • 2021-02-15
    相关资源
    最近更新 更多