获得所有用户使用的第一种付款方式的最有效方式
Posted
技术标签:
【中文标题】获得所有用户使用的第一种付款方式的最有效方式【英文标题】:Most efficient way of getting first payment method used by all users 【发布时间】:2016-05-09 07:30:26 【问题描述】:假设我在名为“客户”的 MSSQL 数据库中有一个表。我还有一个名为“Orders”的表,每个表都包含一个“CustomerID”。我想要做的是生成每个“客户”的第一个“订单”使用的付款方式(我们称之为“PaymentMethod”)的摘要。
我一直使用的方法是进行客户选择查询...
SELECT <Columns> FROM Customers <WHERE>
...然后对每个结果进行单独查询,获取客户第一笔订单的付款方式:
SELECT TOP 1 PaymentMethod FROM Orders ORDER BY Timestamp ASC
此过程的好处是可以通过一种非常简单且易于修改的方式获取我想要的数据,但它的巨大缺点是意味着为每个客户执行查询,这可能意味着 数万次额外查询!
有没有我没想到的更有效的方法?我绞尽脑汁想办法直接从“Orders”表中选择,但要求查询不仅要按“CustomerID”分组,还要获取“Timestamp”的 MIN() 和那么 MIN() 记录的返回“PaymentMethod”似乎不起作用?
【问题讨论】:
【参考方案1】:您可以为此使用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
上述查询选择 earliest-per-group 记录。
【讨论】:
这似乎是我要找的,谢谢!我仍然对所需的查询量感到困扰,但从速度上看,这似乎非常快。对于我接受之前的奖励积分,有没有办法调整它以找到第一次和最后一次购买时使用的“PaymentMethod”? IE 的时间戳是该客户的最低和最高数字? @DuncanMcArdle 您可以使用另一个ROW_NUMBER
和..ORDER BY Timestamp DESC
。【参考方案2】:
我想这对你有帮助。
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
【讨论】:
以上是关于获得所有用户使用的第一种付款方式的最有效方式的主要内容,如果未能解决你的问题,请参考以下文章