我有来自不同系统的一些数据,由于数据集之间的粒度不同,因此只能在某种情况下加入。
给出三列:
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的电话订单。
答案 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
列不参与比较。