如何用Teradata SQL检查客户的National Insurance Number是否唯一
如何在Teradata中检查客户NIN的唯一性并统计重复次数
正确的Teradata SQL查询
要得到每个客户对应的NIN重复次数,使用COUNT()窗口函数是最直接高效的方式,同时可以过滤无效的空值NIN:
SELECT 客户编号, ninnbr, COUNT(*) OVER (PARTITION BY ninnbr) AS 重复次数 FROM 你的客户表名 WHERE ninnbr IS NOT NULL AND ninnbr <> ''; -- 排除无有效NIN的记录
逻辑说明
COUNT(*) OVER (PARTITION BY ninnbr):按ninnbr分组,计算每个分组内的总记录数,也就是该NIN的重复次数,每一行都会显示对应分组的计数结果。WHERE子句:过滤掉空值或空字符串的NIN,避免无效数据干扰统计结果。
你原有代码的问题
你之前使用的SUM(CASE...)窗口函数加上ORDER BY UPDATEDTTM DESC,会计算累计值(从最新记录到当前行的计数),而非该NIN的总重复次数。即使去掉ORDER BY,COUNT()也比SUM(CASE...)更简洁高效。
样本数据验证
用你提供的样本数据执行上述查询,会得到你期望的输出:
| 客户编号 | ninnbr | 重复次数 |
|---|---|---|
| 123 | AA111111AA | 3 |
| 456 | AA111111AA | 3 |
| 678 | AA111111AA | 3 |
| 910 | AB123456AB | 1 |
| 109 | AC123456AB | 1 |
| 549 | AD123456AD | 2 |
| 295 | AD123456AD | 2 |
| 743 | AE123456AE | 1 |
| 443 | AF123456AF | 1 |
| 903 | AG123456AG | 1 |
后续聚合统计
如果要对唯一NIN(重复次数=1)进行聚合统计,有两种高效方式:
方式一:基于窗口函数结果过滤
SELECT ninnbr, COUNT(客户编号) AS 客户数量 -- 可替换为其他聚合操作 FROM ( SELECT 客户编号, ninnbr, COUNT(*) OVER (PARTITION BY ninnbr) AS 重复次数 FROM 你的客户表名 WHERE ninnbr IS NOT NULL AND ninnbr <> '' ) t WHERE 重复次数 = 1 GROUP BY ninnbr;
方式二:直接分组过滤(更高效)
SELECT ninnbr, COUNT(客户编号) AS 客户数量 FROM 你的客户表名 WHERE ninnbr IS NOT NULL AND ninnbr <> '' GROUP BY ninnbr HAVING COUNT(客户编号) = 1;
内容的提问来源于stack exchange,提问作者Ryan
相关产品推荐
相关产品推荐

