假设我在MSSQL数据库中有一个名为“Customers”的表。我还有一个名为“Orders”的表,每个表都包含一个“CustomerID”。我想要做的是生成一个汇总,说明每个“客户”的第一个“订单”使用了哪种付款方式(我们称之为“PaymentMethod”)。
我一直在使用的方法是进行客户选择查询......
SELECT <Columns> FROM Customers <WHERE>
...然后针对每个结果,进行单独的查询以获取客户的第一个订单的付款方式:
SELECT TOP 1 PaymentMethod FROM Orders ORDER BY Timestamp ASC
此过程的好处是可以通过一种易于修改的非常简单的方式获取我想要的数据,但是对于每个客户执行查询意味着巨大的缺点,这可能意味着<每次都有强大的>数万次的额外查询!
有没有更有效的方式来做到这一点,我没有想到?我正在绞尽脑汁想出一种直接从“订单”表开始选择的方法,但要求查询不仅要按“CustomerID”进行分组,还要获取“Timestamp”的MIN()和然后返回MIN()记录的“PaymentMethod”似乎不起作用?
答案 0 :(得分:3)
您可以使用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
以上查询选择最早的每组记录。
答案 1 :(得分:0)
我想这会对你有帮助。
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