按唯一客户分组,然后为最小日期创建列



我有一个包含客户ID的表,transaction_date

表格示例:

ID    |transaction_date
PT2073|2015-02-28    
PT2073|2019-02-28    
PT2013|2015-04-28    
PT2013|2017-02-11   
PT2013|2017-07-11    

目标:我想创建另一列,以便为每个唯一的ID获得第一个第一个交易日期。它应该看起来像:

表格示例:

ID    |transaction_date|first_transaction_date
PT2073|2015-02-28    |2015-02-28 
PT2073|2019-02-28    |2015-02-28 
PT2013|2015-04-28    |2015-04-28
PT2013|2017-02-11    |2015-04-28
PT2013|2017-07-11    |2015-04-28

我创建了另一个表,在其中我选择最小值,然后将其分组:

SELECT id, MIN(transaction_date) as first_transaction_date FROM customer_details GROUP BY id

当我检查表时,我在first_transaction_date列中没有得到与唯一id相同的值。

使用min()作为窗口函数:

select t.*, min(t.transaction_date) over (partition by t.id)
from t;

不需要group by

使用first_value()窗口函数:它给出有序组的第一个值(您的组是由transaction_date排序的id(:

点击查看演示:db<>小提琴

SELECT
*,
first_value(transaction_date) OVER (PARTITION BY id ORDER BY transaction_date)
FROM
mytable

如果您的Postgres版本不支持窗口功能(8.4之前,Amazon Redshift(:

单击演示:db<>小提琴

SELECT
t1.*,
(SELECT min(transaction_date) FROM mytable t2 WHERE t1.id = t2.id)
FROM
mytable t1

最新更新