You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Dynamic SQL全表数据质量唯一性校验逻辑集成方案咨询

全表字段唯一性占比批量计算实现方案

问题核心

你原来的单字段唯一性计算逻辑嵌套了多层子查询,拼接到动态SQL时会出现引号嵌套、聚合函数嵌套冲突的问题,同时单字段多表扫描的写法会导致全表计算时性能极低。

优化方案

先简化唯一性计算逻辑:
原多层子查询可以直接简化为单聚合计算:count(distinct 字段名) 就是该字段的去重非空值数量,除以 count(字段名) 即可得到非空值中的唯一性占比,除以 count(*) 则是全表范围的唯一性占比,完全不需要嵌套子查询。

单独批量计算唯一性占比的完整脚本

/*Unicidad(唯一性维度校验)*/
-- 清理临时表
drop table if exists tmp_unicidad;
declare @custom_sql VARCHAR(max)
declare @tablename as VARCHAR(255) = 'maestrodatoscriticos' -- 替换为你的目标表名

-- 拼接动态SQL头部
set @custom_sql = 'select ''' + @tablename + '_Unicidad' + ''' as tabla'

-- 拼接每个字段的唯一性计算逻辑
select @custom_sql = @custom_sql + ', ' + 
    'cast(count(distinct ' + QUOTENAME(c.name) + ') as decimal) / count(*) as ' + QUOTENAME(c.name)
from sys.columns c
inner join sys.tables t on c.object_id = t.object_id
where t.name = @tablename

-- 拼接收尾逻辑,结果写入临时表
set @custom_sql = @custom_sql + ' into tmp_unicidad from ' + QUOTENAME(@tablename)

-- 调试可打开print查看生成的SQL
-- print @custom_sql
exec (@custom_sql);

-- 写入维度结果表
insert into dimensiones
select *
from tmp_unicidad;

注:如果要和你原有逻辑一致,判断字段是否完全无重复(全唯一返回1,否则返回0),可以把字段计算逻辑替换为:

'cast(iif(count(distinct ' + QUOTENAME(c.name) + ') = count(' + QUOTENAME(c.name) + '), 1, 0) as decimal) as ' + QUOTENAME(c.name)

与原有完整性校验合并的脚本(一次计算两个维度)

如果要一次性得到所有字段的完整性、唯一性两个维度的结果,可以直接修改原有动态SQL的拼接逻辑:

/*Completitud + Unicidad 两个维度合并计算*/
drop table if exists tmp_data_quality;
declare @custom_sql VARCHAR(max)
declare @tablename as VARCHAR(255) = 'maestrodatoscriticos'

set @custom_sql = 'select ''' + @tablename + '_DataQuality' + ''' as tabla'

-- 同时拼接完整性、唯一性两个维度的计算逻辑
select @custom_sql = @custom_sql + 
    ', sum(cast(iif(' + QUOTENAME(c.name) + ' is null,0,1) as decimal)) / count(*) as ' + QUOTENAME(c.name + '_completitud') +
    ', cast(count(distinct ' + QUOTENAME(c.name) + ') as decimal) / count(*) as ' + QUOTENAME(c.name + '_unicidad')
from sys.columns c
inner join sys.tables t on c.object_id = t.object_id
where t.name = @tablename

set @custom_sql = @custom_sql + ' into tmp_data_quality from ' + QUOTENAME(@tablename)
exec (@custom_sql);

insert into dimensiones
select *
from tmp_data_quality;

注意事项

  • 代码中用QUOTENAME包裹字段名、表名,避免字段名包含特殊字符、关键字时报错
  • 计算唯一性时如果字段存在空值,count(distinct)会自动忽略空值,如果需要把空值也视为唯一值的一种,可自行调整计算逻辑为count(distinct isnull(字段名, '占位符'))

内容的提问来源于stack exchange,提问作者metarodri

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 11:24:04