2015-05-19 46 views
0

这很难解释,但我会尽我所能。按客户区分交易,给定销售表(customer_id,article_id)

有一个销售表,它有一个客户购买(简化)的每一篇文章的行。因此,举例来说,如果客户去商店买3样东西,然后另一个客户买两件事情,销售表会是这样的:

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在这种情况下),而这是将要出售的第一个项目,或通过通过支付台(在这种情况下是42)等等。

注意事项:

  • 我也存储在天(但不是交易的确切时间)

  • 有一天很多客户的

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

  • 没有办法让两位顾客同时购买。

+0

您是如何处理客户进行交易然后立即进行另一个交易的角落案例?如果在上面的例子中,所有5行的客户ID都是相同的,如果它们全部用“TRX_ID 1”标记,是否可以? –

+0

你正在使用哪个SQL DBMS? Microsoft SQL Server 2008/2008 R2/2012/2014? MySQL的? –

+0

@BenGribaudo如果所有人都标有TRX_ID,那就完全可以了1 – Marcelo

回答

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减去拿出每个客户的每笔交易分组数。外部查询然后使用该值来分配交易ID(通过DENSE_RANK())和交易相关性(通过ROW_NUMBER()

+0

@马塞洛,做了上述工作?如果是这样,我将删除我关于T-SQL的文本。 –

+0

上面的工作很棒!我只是编辑了一些小的细节,(它与oracle或mysql没有太大区别)非常感谢你,你明白我需要完美的东西。 – Marcelo