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

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

【讨论】:

以上是关于获得所有用户使用的第一种付款方式的最有效方式的主要内容,如果未能解决你的问题,请参考以下文章

插入 5000 多个 Android 联系人的最有效方式

是否可以收听用户使用信用卡进行的任何交易(付款)?

获得所有组合的最有效方法是啥? [复制]

在网站上组织自动付款的最佳方式是啥?

Braintree 未更新用户首选/默认付款方式

在 WooCommerce 中禁用基于用户国家地理 IP 的所有付款方式