如何编写SQL查询仅提取各账户首12个月的交易数据?
提取账户首次交易12个月内的交易数据
要实现这个需求,核心思路是先计算每个账户的首次交易日期,再筛选出该日期往后12个月内的所有交易记录。下面是不同SQL数据库的通用实现方案:
通用SQL逻辑(窗口函数版)
使用窗口函数MIN() OVER (PARTITION BY Account)可以高效获取每个账户的最早交易日期,无需额外子查询或关联操作:
SELECT Account, `Date` FROM ( SELECT Account, `Date`, -- 计算当前账户的首次交易日期 MIN(`Date`) OVER (PARTITION BY Account) AS first_transaction_date FROM Transactions ) AS subquery -- 筛选交易日期在首次交易日期起12个月内的记录 WHERE `Date` <= DATE_ADD(first_transaction_date, INTERVAL 1 YEAR) -- 若需要排除首次交易满12个月当天的记录,改用: -- WHERE `Date` < DATE_ADD(first_transaction_date, INTERVAL 1 YEAR)
不同数据库的日期函数适配
不同数据库对日期加减的语法略有差异,这里给出主流数据库的写法:
MySQL/MariaDB
WHERE `Date` <= DATE_ADD(first_transaction_date, INTERVAL 1 YEAR)
PostgreSQL
WHERE "Date" <= first_transaction_date + INTERVAL '1 year'
SQL Server
WHERE [Date] <= DATEADD(YEAR, 1, first_transaction_date)
Oracle
WHERE "Date" <= ADD_MONTHS(first_transaction_date, 12)
针对示例数据的验证结果
结合你提供的示例数据:
Apples的首次交易日期是2022-01-01,12个月后为2023-01-01,因此注释的2023-01-01和2023-07-01会被排除;Bananas的首次交易日期是2022-05-01,12个月后为2023-05-01,所有现有记录都在范围内;Oranges的首次交易日期是2023-01-01,现有记录均在12个月窗口内,会全部保留。
内容的提问来源于stack exchange,提问作者Mkhomiak2
相关产品推荐
相关产品推荐

