SQL - 获取具有整数和 varchar 列的所有列中空行的百分比?
SQL - Get percentage of empty rows in all columns with integer and varchar columns?
我有一个包含 300 多列的 table,我想看看是否有办法获取每列中空行的百分比。我想使用 Python 提取数据,然后编写一个函数。但是,有 400,000,000 多行,所以这是不可行的。所以现在我使用 sum 和 case when 语句手动获取每列的百分比,如下所示:
select (100.0 * sum(case when A = ' ' or A is null then 1 else 0 end)) / count(*) as A
,(100.0 * sum(case when B is null then 1 else 0 end)) / count(*) as B
,(100.0 * sum(case when C = ' ' or C is null then 1 else 0 end)) / count(*) as C
,(100.0 * sum(case when D = ' ' or D is null then 1 else 0 end)) / count(*) D
,(100.0 * sum(case when E = ' ' or E is null then 1 else 0 end)) / count(*) E
,(100.0 * sum(case when F is null then 1 else 0 end)) / count(*) as F
....
from table
我已经为大约 30 列完成了此操作,但我正在尝试查看是否有一种方法可以在 table 中的所有列中执行此操作。有些列包含整数,所以我不能使用
case when C = ' ' or C is null then 1 else 0 end
我必须使用
case when C is null then 1 else 0 end
有没有办法继续使用这种逻辑,其中 case 语句会根据列的类型发生变化并获取所有列的百分比?谢谢
我解决这个问题的方法是使用 Python 和 Redshift。不确定这是否是最好的方法,但这对我有用。
我首先使用@nachospiu 评论'pg_get_cols'中的函数来获取所有列名
query = '''select col_name
from pg_get_cols("schema.table")
cols(view_schema name, view_name name, col_name name, col_type varchar, col_num int)
'''
cols = pd.read_sql_query(query, rsm.dbengine)
然后,一旦我有了所有的列名,我就创建了一个 for 循环,使用 try 和 except 语句获取每列的百分比,这样如果列不是 varchar 类型,它就不会失败。
nulls = {}
for col in cols.col_name:
try:
que = '''select (100.0 * sum(case when {} = ' ' or {} is null then 1 else 0 end)) / count(*) as perc
from schema.table
'''.format(col, col)
perc = pd.read_sql(que, rsm.dbengine).perc.values[0]
nulls[col] = perc
except:
que = '''select (100.0 * sum(case when {} is null then 1 else 0 end)) / count(*) as perc
from schema.table
'''.format(col)
perc = pd.read_sql(que, rsm.dbengine).perc.values[0]
nulls[col] = perc
这生成了一个字典,允许我查看每列的空值百分比。
我有一个包含 300 多列的 table,我想看看是否有办法获取每列中空行的百分比。我想使用 Python 提取数据,然后编写一个函数。但是,有 400,000,000 多行,所以这是不可行的。所以现在我使用 sum 和 case when 语句手动获取每列的百分比,如下所示:
select (100.0 * sum(case when A = ' ' or A is null then 1 else 0 end)) / count(*) as A
,(100.0 * sum(case when B is null then 1 else 0 end)) / count(*) as B
,(100.0 * sum(case when C = ' ' or C is null then 1 else 0 end)) / count(*) as C
,(100.0 * sum(case when D = ' ' or D is null then 1 else 0 end)) / count(*) D
,(100.0 * sum(case when E = ' ' or E is null then 1 else 0 end)) / count(*) E
,(100.0 * sum(case when F is null then 1 else 0 end)) / count(*) as F
....
from table
我已经为大约 30 列完成了此操作,但我正在尝试查看是否有一种方法可以在 table 中的所有列中执行此操作。有些列包含整数,所以我不能使用
case when C = ' ' or C is null then 1 else 0 end
我必须使用
case when C is null then 1 else 0 end
有没有办法继续使用这种逻辑,其中 case 语句会根据列的类型发生变化并获取所有列的百分比?谢谢
我解决这个问题的方法是使用 Python 和 Redshift。不确定这是否是最好的方法,但这对我有用。
我首先使用@nachospiu 评论'pg_get_cols'中的函数来获取所有列名
query = '''select col_name
from pg_get_cols("schema.table")
cols(view_schema name, view_name name, col_name name, col_type varchar, col_num int)
'''
cols = pd.read_sql_query(query, rsm.dbengine)
然后,一旦我有了所有的列名,我就创建了一个 for 循环,使用 try 和 except 语句获取每列的百分比,这样如果列不是 varchar 类型,它就不会失败。
nulls = {}
for col in cols.col_name:
try:
que = '''select (100.0 * sum(case when {} = ' ' or {} is null then 1 else 0 end)) / count(*) as perc
from schema.table
'''.format(col, col)
perc = pd.read_sql(que, rsm.dbengine).perc.values[0]
nulls[col] = perc
except:
que = '''select (100.0 * sum(case when {} is null then 1 else 0 end)) / count(*) as perc
from schema.table
'''.format(col)
perc = pd.read_sql(que, rsm.dbengine).perc.values[0]
nulls[col] = perc
这生成了一个字典,允许我查看每列的空值百分比。