2017-04-06 32 views
0

我有來自不同系統的一些數據,只能在一定的情況下被接合,因爲數據集之間不同粒度的。標記唯一的行嗎?

鑑於三列:

call_date, login_id, customer_id 

我怎樣纔能有效的「國旗」,這具有跨越這三個值的唯一值的每一行?我不想SELECT DISTINCT,因爲我不知道哪一行實際上與另一行匹配。我想知道哪些記錄(列的組合)僅在一個日期中存在一次。例如,如果客戶在單個日期中調用了5次並訂購了一個產品,我不知道哪些特定的通話記錄與產品訂單(原始數據中缺少時間戳)有關。但是,如果客戶只在特定日期稱爲一次,有一個產品訂單,我知道肯定的順序關係回到那個呼叫記錄。 (這只是一個例子 - 我在大約來自不同源數據的7個不同表中做類似的事情)。

timestamp   customer_id login_name score unique 
01/24/2017 18:58:11 441987  abc123 .25  TRUE 
03/31/2017 15:01:20 783356  abc123 1  FALSE 
03/31/2017 16:51:32 783356  abc123 0  FALSE 


call_date customer_id login_name order unique 
01/24/2017  441987 abc123 0  TRUE 
03/31/2017  783356 abc123 1  TRUE 

在上面的例子中,我只想連接兩個表的'uniqueness'爲True的行。所以在1/24,我知道這個電話沒有訂單,只有0.25分。

回答

1

要查找的行(或列)是否爲行列表中唯一的,你需要使用的PostgreSQL window functions

SELECT *, 
    (count(*) OVER(PARTITION BY b, c, d) = 1) as unique_within_b_c_d_columns 
FROM unnest(ARRAY[ 
    row(1, 2, 3, 1), 
    row(2, 2, 3, 2), 
    row(3, 2, 3, 2), 
    row(4, 2, 3, 4) 
]) as t(a int, b int, c int, d int) 

輸出:

| a | b | c | d | unique_within_b_c_d_columns | 
----------------------------------------------- 
| 1 | 2 | 3 | 1 | true      | 
| 2 | 2 | 3 | 2 | false      | 
| 3 | 2 | 3 | 2 | false      | 
| 4 | 2 | 3 | 4 | true      | 

PARTITION條款,你需要指定你想在比較列的列表。另外,在上述a列中的示例不參加比較。