将第一笔订单数据汇总到所有订单-Microsoft SQL Server

时间:2019-07-03 14:54:48

标签: sql sql-server greatest-n-per-group

这是用于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,以便在每个订单上我也可以从初始订单中提取数据。在此示例中,该信息是他们的首次购买日期和他们的第一笔交易编号。

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

1 个答案:

答案 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
                          );