Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 为每个客户选择首次购买_Sql_Sql Server_Sql Server 2005 - Fatal编程技术网

Sql 为每个客户选择首次购买

Sql 为每个客户选择首次购买,sql,sql-server,sql-server-2005,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

我们试图在类似以下表格中为每位客户选择第一次购买:

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
我们试图实现的查询的预期结果是:

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
我们得到的最接近的查询如下:

SELECT customer_id, MIN(purchase_date) As first_occurence
FROM Sales_Transactions_Header
GROUP BY customer_id;
结果如下:

customer_id  first_occurence
1            2012-08-24
2            2013-09-05
3            2010-09-06
但是,当我们选择所需字段的其余部分时,我们显然必须将它们添加到GROUPBY子句中,这将使MIN的结果不同。我们也试图加入它,但没有取得任何进展


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

听起来像是CTE的工作

CTE将允许您获得每个客户的最早购买日期。然后,您将其加入到关于customer_id和日期的原始表中,获得该事务的其余信息

像这样:

with first_date as(
  select customer_id,
  min(purchase_date) as first_purchase
  from
  table1
  group by
  customer_id
)
select
t1.transaction_no,
t1.customer_id,
t1.operator_id,
t1.purchase_date
from
table1 t1
inner join first_date
on
purchase_date = first_purchase
and t1.customer_id = first_date.customer_id

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

您可以使用该功能来帮助您实现这一点

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

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

下面的查询也将提供解决方案

select * from customer_sale_details 
     where purchase_date in (select min(purchase_date)
           from customer_sale_details c1 group by c1.customer_id); 

嗯…为什么是向下投票,它会准确返回请求的结果?可能是因为你应该在这里发布代码,而不仅仅是提供一个链接。在将H.*更改为H.transaction\u no,H.customer\u id,H.operator\u id后,这项功能非常有效,H.purchase\u date,因为表中有大量其他列。如果min purchase\u date与另一个客户的不同purchase\u date匹配,则实际上可能返回错误的值
select * from customer_sale_details 
     where purchase_date in (select min(purchase_date)
           from customer_sale_details c1 group by c1.customer_id);