这是用于Microsoft SQL Server。
我正在尝试在类似于以下表格中为每个客户选择首次购买商品:
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
我们试图实现的查询的预期结果是:
first_transaction_no customer_id operator_id purchase_date first_purchase
20503 1 5 2012-08-24 2012-08-24
20503 1 7 2013-10-15 2012-08-24
20505 2 5 2013-09-05 2013-09-05
20506 3 7 2010-09-06 2010-09-06
20506 3 7 2012-07-30 2010-09-06
我们最接近的是以下查询:
SELECT a.customer_id, MIN(a.purchase_date) As first_occurence
FROM Sales_Transactions_Header as a
GROUP BY a.customer_id;
具有以下结果:
customer_id first_occurence
1 2012-08-24
2 2013-09-05
3 2010-09-06
但是,当我们选择其余所需字段时,显然必须将它们添加到GROUP BY子句中,这将使MIN的结果有所不同。我们还尝试将其自身加入其中,但是没有取得任何进展。
基本上,我要做的只是将初始MIN订单中的数据附加到客户ID,以便在每个订单上我也可以从初始订单中提取数据。在此示例中,该信息是他们的首次购买日期和他们的第一笔交易编号。
如何在不使聚合函数混淆的情况下获取其余相关值?
答案 0 :(得分:2)
使用窗口功能:
SELECT sth.*,
MIN(purchase_date) OVER (PARTITION BY customer_id) As first_occurence
FROM Sales_Transactions_Header sth;
编辑:
如果您想为每个客户提供第一个购买行,那么我建议您使用相关子查询:
select sth.*
from Sales_Transactions_Header sth
where sth.purchase_date = (select min(sth2.purchase_date)
from Sales_Transactions_Header sth2
where sth2.customer_id = sth.customer_id
);