我有一个通过不同账户提取交易数据的查询。我只想按销售提取尾随交易的前 12 个月。例如 - 这两条记录不会提取,因为它们超出了自第一个交易日期以来的十二个月窗口。我将如何编写这样的查询?如果非常感谢任何帮助!
Account Date
Apples 1/1/2022
Apples 5/1/2022
Apples 8/1/2022
Apples 9/1/2022
Apples 12/1/2022
--Apples 1/1/2023
--Apples 7/1/2023
Bananas 5/1/2022
Bananas 6/1/2022
Bananas 7/1/2022
Bananas 12/1/2022
Oranges 1/1/2023
Oranges 2/1/2023
Oranges 3/1/2023
Oranges 4/1/2023
在 PostgreSQL 上测试:
create table testdata (Account varchar(50), thedate date);
insert into testdata values ('Apples', '2022/1/1');
insert into testdata values ('Apples', '2022/5/1');
insert into testdata values ('Apples', '2022/8/1');
insert into testdata values ('Apples', '2022/9/1');
insert into testdata values ('Apples', '2022/12/1');
insert into testdata values ('Apples', '2023/1/1');
insert into testdata values ('Apples', '2023/7/1');
insert into testdata values ('Bananas', '2022/5/1');
insert into testdata values ('Bananas', '2022/6/1');
insert into testdata values ('Bananas', '2022/7/1');
insert into testdata values ('Bananas', '2022/12/1');
insert into testdata values ('Oranges', '2023/1/1');
insert into testdata values ('Oranges', '2023/2/1');
insert into testdata values ('Oranges', '2023/3/1');
insert into testdata values ('Oranges', '2023/4/1');
select * from testdata;
account | thedate
---------+------------
Apples | 2022-01-01
Apples | 2022-05-01
Apples | 2022-08-01
Apples | 2022-09-01
Apples | 2022-12-01
Apples | 2023-01-01
Apples | 2023-07-01
Bananas | 2022-05-01
Bananas | 2022-06-01
Bananas | 2022-07-01
Bananas | 2022-12-01
Oranges | 2023-01-01
Oranges | 2023-02-01
Oranges | 2023-03-01
Oranges | 2023-04-01
现在查询:
select * from testdata
where thedate < (select min(thedate) + INTERVAL '12 months'
from testdata);
account | thedate
---------+------------
Apples | 2022-01-01
Apples | 2022-05-01
Apples | 2022-08-01
Apples | 2022-09-01
Apples | 2022-12-01
Bananas | 2022-05-01
Bananas | 2022-06-01
Bananas | 2022-07-01
Bananas | 2022-12-01
您可以使用窗口函数简单高效地完成此操作:
select account, date
from (
select t.*, min(date) over(partition by account) as min_date
from mytable t
) t
where date < min_date + interval '1' year
想法是用一个窗口
min()
计算每个账户的最早日期。然后我们可以使用这些信息来过滤数据集。
你没有标记你正在运行的数据库。日期算法的语法确实因数据库引擎而异:以上是标准的 ANSI SQL,您可能需要适应您的 RDBMS。