基于Oracle中的匹配代码创建customer_id(SQL)

时间:2014-05-29 15:35:32

标签: sql oracle matching consolidation

我有一个包含客户购买的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代码是什么?

1 个答案:

答案 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写一些更好的东西......