假设我在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