标记唯一的行?

时间:2017-04-06 21:33:49

标签: postgresql

我有来自不同系统的一些数据,由于数据集之间的粒度不同,因此只能在某种情况下加入。

给出三列:

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 个答案:

答案 0 :(得分: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列不参与比较。