在给定销售表(customer_id,article_id)的情况下按客户区分交易

时间:2015-05-19 15:31:47

标签: sql netezza

这很难解释,但我会尽我所能。

有一个销售表,对于客户购买的每篇文章(简化)都有一行。所以,例如,如果顾客去商店买3件东西,然后另一个顾客买2件东西,那么销售表就是这样的:

ID  |  CUSTOMER_ID | ARTICLE_ID 
1          21            42
2          21            32
3          21            34
4          22            42
5          22            33

问题在于我需要添加两个新列。

  • TRX_ID(transaction_id):当客户访问商店,购买商品并离开时。

  • TRX_COR(transaction_correlative):它是交易文章的位置。

结果应该显示:

ID  |  CUSTOMER_ID | ARTICLE_ID | TRX_ID | TRX_COR
1          21            42         1        1
2          21            32         1        2
3          21            34         1        3
4          22            42         2        1
5          22            33         2        2

根据这些信息,我可能知道实际有多少交易(在这种情况下为2),这是第一个要出售或通过paydesk(在这种情况下为42)的项目,等等。

考虑:

  • 我还存储了当天(但不是交易的确切时间)

  • 白天有很多客户

  • 一位客户可以在白天返回,这是一项全新的交易。

  • 两个顾客无法同时购买。

1 个答案:

答案 0 :(得分:1)

使用window aggregates的下面的内容应该(我认为)以您请求的方式计算ID。

SELECT ID, Customer_ID, Article_ID,
    DENSE_RANK() OVER (ORDER BY Customer_ID, Gr) AS TRX_ID,
    ROW_NUMBER() OVER (PARTITION BY Customer_ID, Gr ORDER BY ID) AS TRX_COR 
FROM (
    SELECT *, 
        ROW_NUMBER() OVER (ORDER BY ID)-ROW_NUMBER() OVER (ORDER BY Customer_ID, ID) AS Gr
    FROM [Test].[dbo].[Netezza]
) data

在内部查询中,按行号比客户ID减去行号,以得出每个客户每个事务的分组编号。外部查询然后使用此值来分配事务ID(通过DENSE_RANK())和事务相关(通过ROW_NUMBER()