仅按前十二个月分组

问题描述 投票:0回答:2

我有一个通过不同账户提取交易数据的查询。我只想按销售提取尾随交易的前 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
sql subquery window-functions
2个回答
0
投票

在 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

0
投票

您可以使用窗口函数简单高效地完成此操作:

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。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.