获得所有用户使用的第一种付款方式的最有效方式



假设我在MSSQL数据库中有一个名为"Customers"的表。我还有一个名为"Orders"的表,每个表都包含一个"CustomerID"。我想做的是生成每个"客户"的第一个"订单"使用的付款方式(我们称之为"PaymentMethod")的摘要。

我一直使用的方法是进行客户选择查询。。。

SELECT <Columns> FROM Customers <WHERE>

然后对每个结果进行单独的查询,以获得客户的第一个订单的付款方式:

SELECT TOP 1 PaymentMethod FROM Orders ORDER BY Timestamp ASC

这个过程的好处是以一种非常简单、易于修改的方式获得我想要的数据,但最大的缺点是,这意味着要为每个客户执行一个查询,这可能意味着每次都会有数万个的额外查询!

有没有一种我没有想过的更有效的方法来做到这一点?我绞尽脑汁想办法直接从"Orders"表中进行选择,但查询不仅要按"CustomerID"分组,还要获取"Timestamp"的MIN(),然后返回MIN()记录的"PaymentMethod"的要求似乎不起作用?

您可以使用ROW_NUMBER进行以下操作:

SELECT PaymentMethod 
FROM (
   SELECT PaymentMethod,
          ROW_NUMBER() OVER (PARTITION BY CustomerID  
                             ORDER BY Timestamp ASC) AS rn
   FROM Orders ) AS t
WHERE t.rn = 1

上面的查询选择每个组最早的记录。

我想这对你有帮助。

SELECT C.* , O.PAYMENTMETHOD FROM Customers C
INNER JOIN Orders O ON O.CustomerID = C.CustomerID
WHERE O.OrderTime = 
(SELECT TOP 1 OrderTime FROM Customers WHERE CustomerID = C.CustomerID) -- selects customer first order based on min time

相关内容

最新更新