将最高记录与最高记录-1进行比较

时间:2013-10-11 16:42:31

标签: sql-server sql-server-2008

我被要求创建一份报告,比较所有客户最近的订单和之前的订单,然后只比较并返回那些下订单金额较高的订单作为下一个订单。 (我真的希望这是有道理的)

订单历史记录表的布局方式是每个客户都有一个顺序到该客户的订单号(EG如果客户下了5个订单,那么他们的最高订单号是5,这应该会使这更容易。 )因此,对于有5个订单的客户,我想比较订单#的4和5,然后只有在订单#5用于更高的美元金额时才返回该客户。

订单金额存储在不同的表中,但它们通过guid引用(ID)链接。

SELECT TOP 1 CO.OrderNumber
                        ,COD.Amount
                FROM cust_OrderDetail COD
                    INNER JOIN dbo.cust_Order CO ON Cod.cust_OrderID = CO.ID 
                    INNER JOIN Customer c ON CO.Customer = c.ID
                WHERE COD.Amount > (SELECT COD1.Amount
                                        FROM cust_OrderDetail COD1
                                        INNER JOIN dbo.cust_Order CO1 ON Cod1.cust_OrderID = CO1.ID 
                                            WHERE CO1.Ordernumber = (This is where I fall apart)

我希望这是有道理的。我最后在那里崩溃了。我知道如何链接所有其他细节以及此处所需的所有其他内容。正是这一次比较让我大吃一惊。

1 个答案:

答案 0 :(得分:0)

假设您的查询正确返回Customer和CustomerOrder信息

方法:在CTE中获得每位客户的前2条记录,然后将Topmost记录与之前的记录进行比较。

WITH Top2 AS (
  SELECT *
  FROM
  (
SELECT c.ID, CO.OrderNumber ,COD.Amount,
  ROW_NUMBER() OVER(PARTITION BY c.ID ORDER BY c.ID, CO.OrderNumber DESC) Rnk
FROM cust_OrderDetail COD
 INNER JOIN dbo.cust_Order CO ON Cod.cust_OrderID = CO.ID 
INNER JOIN Customer c ON CO.Customer = c.ID
    ) T WHERE Rnk <= 2)


SELECT * FROM
(SELECT * FROM Top2 Where Rnk = 1) T1
LEFT JOIN (SELECT * FROM Top2 Where Rnk = 2) T2
ON T1.ID = T2.ID
AND T1.Amount > T2.amount