为每位客户选择首次购买

spy*_*don 7 sql sql-server sql-server-2005

我们正试图在类似于下表的表中为每个客户选择第一次购买:

transaction_no  customer_id  operator_id  purchase_date
20503           1            5            2012-08-24
20504           1            7            2013-10-15
20505           2            5            2013-09-05
20506           3            7            2010-09-06
20507           3            7            2012-07-30
Run Code Online (Sandbox Code Playgroud)

我们尝试实现的查询的预期结果是:

transaction_no  customer_id  operator_id  first_occurence
20503           1            5            2012-08-24
20505           2            5            2013-09-05
20506           3            7            2010-09-06
Run Code Online (Sandbox Code Playgroud)

我们得到的最接近的是以下查询:

SELECT customer_id, MIN(purchase_date) As first_occurence
FROM Sales_Transactions_Header
GROUP BY customer_id;
Run Code Online (Sandbox Code Playgroud)

结果如下:

customer_id  first_occurence
1            2012-08-24
2            2013-09-05
3            2010-09-06
Run Code Online (Sandbox Code Playgroud)

但是当我们选择剩下的所需字段时,我们显然必须将它们添加到GROUP BY子句中,这将使MIN的结果不同.我们也试图自己加入,但没有取得任何进展.

如何在不使聚合函数混淆的情况下获得其余的相关值?

Szy*_*mon 6

您可以简单地将您提出的查询视为内部查询.这也适用于旧版本的SQL Server(您没有指定SQL Server的版本).

SELECT H.transaction_no, H.customer_id, H.operator_id, H.purchase_date
FROM Sales_Transactions_Header H
INNER JOIN
    (SELECT customer_id, MIN(purchase_date) As first_occurence
    FROM Sales_Transactions_Header
    GROUP BY customer_id) X
ON H.customer_id = X.customer_id AND H.purchase_date = X.first_occurence
Run Code Online (Sandbox Code Playgroud)


Jus*_*ard 6

您可以使用ROW_NUMBER函数来帮助您。

这是如何为您的案例做到这一点。

WITH Occurences AS 
(
    SELECT 
        *,
        ROW_NUMBER () OVER (PARTITION BY customer_id order by purchase_date ) AS "Occurence"            
    FROM Sales_Transactions_Header
)
SELECT 
    transaction_no,
    customer_id,
    operator_id,
    purchase_date
FROM Occurences 
WHERE Occurence = 1
Run Code Online (Sandbox Code Playgroud)