分组中首次/末次日期对应交易类型的统计实现问询
嘿,我来帮你搞定这个交易数据的统计需求!针对你提到的「按唯一ID的首次/末次交易时间,统计各交易名称的对应次数」的需求,我分Excel和SQL两种常用场景给你具体方案:
方案一:用Excel实现
如果你的数据在Excel里,我们可以通过辅助列+数据透视表来完成:
- 添加首次交易标记列:插入新列(比如D列),命名为「首次交易名称」,输入公式:
=IF(B2=MINIFS(B:B,A:A,A2),C2,"")
这个公式会判断当前行的时间戳是不是该唯一ID下的最早时间,是就返回交易名称,否则留空。 - 添加末次交易标记列:再插入新列(比如E列),命名为「末次交易名称」,输入公式:
=IF(B2=MAXIFS(B:B,A:A,A2),C2,"")
同理,判断当前行是否为该ID的最晚交易时间,返回对应名称。 - 创建数据透视表统计:
- 选中所有数据(含辅助列),点击「插入」→「数据透视表」;
- 把「首次交易名称」拖到「行」区域,「唯一ID」拖到「值」区域,将值字段设置为「计数」,就能得到各交易名称作为首次交易的总次数;
- 重复操作,把「末次交易名称」拖到「行」区域,即可得到末次交易的统计结果。
方案二:用SQL实现
如果数据存在数据库中,用SQL可以更高效地完成统计,无需手动添加辅助列:
先通过CTE(公共表表达式)给每个唯一ID计算出首次、末次交易的时间戳,再统计对应交易名称的次数:
WITH id_transaction_info AS ( SELECT A AS unique_id, C AS transaction_name, B AS transaction_timestamp, -- 计算当前ID的最早交易时间 MIN(B) OVER (PARTITION BY A) AS first_trans_time, -- 计算当前ID的最晚交易时间 MAX(B) OVER (PARTITION BY A) AS last_trans_time FROM your_table_name -- 替换成你的表名 ) SELECT transaction_name, -- 统计作为首次交易的次数 SUM(CASE WHEN transaction_timestamp = first_trans_time THEN 1 ELSE 0 END) AS first_trans_count, -- 统计作为末次交易的次数 SUM(CASE WHEN transaction_timestamp = last_trans_time THEN 1 ELSE 0 END) AS last_trans_count FROM id_transaction_info GROUP BY transaction_name;
注意:如果某个唯一ID的首次和末次交易是同一个名称,这条记录会被同时计入「首次」和「末次」的统计中,符合实际业务逻辑。
内容的提问来源于stack exchange,提问作者jrb2b
相关产品推荐
相关产品推荐

