gpt4 book ai didi

sql - PostgreSQL 中一年窗口模式

转载 作者:行者123 更新时间:2023-11-29 12:56:10 24 4
gpt4 key购买 nike

我有一个成员交易的 Redshift 表,每个交易都有一个状态:

      date|member_id|transaction_amount|state
----------+---------+------------------+-----
01/05/2012|aaaaaaaaa| 35.50| WA
02/05/2012|aaaaaaaaa| 35.50| WA
03/05/2012|aaaaaaaaa| 35.50| WA
...
01/05/2013|aaaaaaaaa| 35.50| WA
02/05/2013|aaaaaaaaa| 35.50| CA
03/05/2013|aaaaaaaaa| 35.50| CA
...

我想做的是,对于每笔交易,选择过去 12 个月内发生次数最多的状态,并将其与给定交易相关联。

我的第一个想法是像这样进行连接:

select t0.*, t1.state from transactions t0
join transactions t1
on datediff('month', t1.date, t0.date) between 0 and 12

然后我将按datemember_id、其他未显示的列、transaction_amount 分组,并计算每个状态的出现次数,保留一个出现最多的(在该组中具有最大的 count)。

我在做这最后一部分时遇到了麻烦。我的问题是,如何从这个表中为每个组选择最频繁的状态?另一个问题是,是否有更有效的方法来做到这一点(避免这种加入)?

最佳答案

做一个运行模式真的很棘手。您可以通过以下方式修改您的查询:

select id, state
from (select t.id, t2.state, count(*) as cnt,
row_number() over (partition by t.id order by count(*) desc) as seqnum
from transactions t join
transactions t2
on datediff('month', t2.date, t.date) between 0 and 12
group by t1.id, t2.state
) ts
where seqnum = 1;

这仅使用交易 ID。您可能想要测试这个版本,您可以在其中重新加入以获取所需的字段,并在第二个版本中将这些字段包含在此查询中。

(您可能还希望包括 member_id;问题在这一点上并不清楚。)

如果没有自连接(或同等功能),我很难想出在 Redshift 中执行此操作的方法。

关于sql - PostgreSQL 中一年窗口模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42793032/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com