2015-05-19 75 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