我有一个包含客户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