2017-04-05 36 views
0

我的用例是计算表中每列的空计数(它有500列)..我不能手动,因为这大量的列..可以任何人请建议我如何继续这一点。 ..如何获得具有500列的表中的每列的空计数?

+0

使用电子表格构建查询。但是由于RedShift是一个列式数据库,如果查询需要很长时间,请不要感到惊讶。 –

+0

你有多少行? –

+0

近800万行有 –

回答

1

对于任何给定列就可以了,当然,只是运行:

select count(1) from column_name where column_name is null 

500列,不过,你肯定会想以编程方式创建查询。你有两个选择:哪一个更快将取决于你的表有多大以及你的列是如何编码的。

选项1:列逐列法

如果您运行以下查询(与WHERE tablename='yourtable'而不是“用户”),输出本身是可以运行来获得你的答案查询。

SELECT 'select \'spacer\' AS column_name, 0 AS null_count ' union all 
SELECT 'union all select \'' || "column" || '\', count(1) from ' || tablename || ' where ' || "column" || ' is null' 
FROM pg_table_def 
WHERE tablename = 'users' 
AND NOT "notnull" 

选项2:一行一行地方法

此查询的输出也会给你空计数(一定要的users两个实例更改为自己的表名!)

SELECT 'select' UNION ALL SELECT 'count(nvl2(' || "column" || ',null,1)) as ' || "column" || ', ' 
FROM pg_table_def 
WHERE tablename = 'users' 
AND NOT "notnull" 
UNION ALL 
SELECT 'null as spacer from users ' 

第二个选项使用两个奇特的功能。首先,count(exp)将计算exp不为null的实例的数量。

其次,更令人困惑的是:nvl2(exp, val1, val2)方法将返回val1,如果exp不是null,并返回val2,如果它为null。所以nvl2(exp,null,1)相当于nullif(exp is not null)。这意味着count(exp)将计算exp的非空事件,而count(nvl2(exp,null,1))将计数exp的空事件。

+0

感谢您的快速反应您可以请给我一个小例子?为选项1查询 –

+0

非常感谢它为我工作...... :) –

+0

我的编辑器(DataGrip)很确定它不喜欢选项一中第一行的结尾(SELECT ... union all),而且redshift返回一个错误“在输入结束时出现无效的语法错误,是单个查询的全部内容还是我有'第二部分(SELECT ....“notnull”)返回我期待的内容 – DaveRGP

相关问题