我有一个包含客户购买的oracle数据库。 (一条记录是一次购买)客户在每次购买时一次又一次地提供他们的个人数据。因此,由于输入错误,地址变更等原因可能存在差异。现在我必须识别属于同一客户的购买。
为此,我根据简单的规则创建了3个不同的匹配代码。我的表现在看起来像这样:
+-------------+-------------+-------------+-------------+-------------+ | PURCACHE_ID | MATCHCODE_1 | MATCHCODE_2 | MATCHCODE_3 | CUSTOMER_ID | +-------------+-------------+-------------+-------------+-------------+ | | | | | | | 1 | 1 | b | x | | | | | | | | | 2 | 1 | a | y | | | | | | | | | 3 | 2 | c | x | | | | | | | | | 4 | 3 | a | z | | | | | | | | | ... | ... | ... | ... | ... | +-------------+-------------+-------------+-------------+-------------+
我想要做的是为每次购买分配一个customer_id。如果任何匹配代码等于另一个匹配代码,则将相同的customer_id分配给购买。
因此,例如,购买1和购买2将接收相同的customer_id,因为匹配代码1是相同的。另外购买2和购买4属于同一客户因为Matchcode_2是相同的。因此,即使购买1和购买4也会收到相同的customer_id,尽管他们的匹配代码都不等于。
Customer_id可以是从1开始的简单数字。
制作Customer_Id的SQL代码是什么?
答案 0 :(得分:0)
天真的解决方案:
-- Just number them
UPDATE purchases SET customer_id = rownum;
-- Group all customers with given matchcode_1 into one
MERGE INTO purchases p
USING (SELECT matchcode_1, min(customer_id) customer_id
FROM purchases
GROUP BY matchcode_1) m
ON (p.matchcode_1 = m.matchcode_1)
WHEN MATCHED THEN
UPDATE SET p.customer_id = m.customer_id;
-- Repeat the above merge for matchcode_2, matchcode_3
-- then matchcode_1 again and so on
-- until none of the matchcodes make any updates
你可以用PL / SQL写一些更好的东西......