1

我在一家信用卡公司工作。我们的数据库有一个客户表和一个交易表。客户表中的字段是 SSN 和 CustomerKey。交易表中的字段是 CustomerKey、交易日期 (Transdate) 和交易金额 (TransAmt)。

我需要一份报告,可以列出每个 ssn 的每笔交易,其中交易金额的总和在 2012 年的两天内 > 1000。

以下是交易表中原始数据的示例:

Trans#-----CustKey-----Date--------Amount
1-----------12345----01/01/12--------$600
2-----------12345----01/02/12--------$500
3-----------67890----01/03/12--------$700
4-----------12345----04/01/12--------$600
5-----------67890----04/02/12--------$600

以下是客户表中原始数据的示例:

CustKey-----SSN
12345------123456789
67890------123456789

这是我需要的结果:

Trans#------SSN---------Date---------Amount---Group Key
1--------123456789----01/01/12---------$600--------1
2--------123456789----01/02/12---------$500--------1 
2--------123456789----01/02/12---------$500--------2 
3--------123456789----01/03/12---------$700--------2
4--------123456789----04/01/12---------$600--------3
5--------123456789-----04/02/12--------$600--------3

正如您在我的结果中看到的那样,Trans#2 被列出两次,因为它是一组在 2 天内超过 1000 美元的交易的一部分。每组超过 1000 的事务由一个组密钥标识。

4

1 回答 1

0

假设您没有领先/滞后功能,我的方法如下。

首先,确定符合您标准的日期对。您可以通过自联接来执行此操作,以查找符合您条件的日期对的交易。现在,您有了日期的描述,但这些日期在一行而不是两行。

因此,您需要将其加入到交易中。第一次约会,第二次约会。如果满足多个条件,这种双重连接(实际上是左外连接)将允许事务出现多次。

这是一个尝试这样做的查询:

with pairs as
     (select t.trans, t.ssn, min(date) as mindate, max(date) as maxdate
      from (select t.*, c.ssn
            from transaction t join
                 customer c
                 on t.custkey = c.custkey
           ) t join
           (select t.*, c.ssn
            from transaction t join
                 customer c
                 on t.custkey = c.custkey
           ) tnext
           on t.ssn= tnext.ssn and
              t.date = tnext.date - 1
      group by t.trans, t.ssn, t.amount
      having sum(t.amount) > 1000
     ) pairs
select t.trans, c.ssn
from transactions t. join
     customer c
     on t.custkey = c.custkey left outer join
     pairs pfirst
     on t.date = pfirst.mindate and
        c.custkey = pfirst.custkey left outer join
     pairs plast
     on t.date = plast.maxdate and
        c.custkey = plast.custkey
于 2012-09-19T01:18:04.307 回答