[英]Count values for every column in a table
目前使用 Postgres 9.1。 我正在寻找一种方法来获取特定表中每一列的计数。 它有大约 600 列,如下所示:
CREATE TABLE geoproject.mes_wastab (
invid character varying(16)
, invtype character varying(3)
, smpid integer
, smpname character varying(40)
, smpdate date
, smptime character varying(5)
, o2st_p double precision
, wspgokna double precision
, o2_p double precision
, absenkungs double precision
, klarstrom3 double precision
, ...
);
应从information_schema.columns
查询列名。 应该计算非空值。 结果应如下所示:
column_name : count
我可以用 SQL 查询这个,还是需要一个函数?
此查询将创建 DML 语句以获取您想要的内容。
SELECT 'SELECT ' || string_agg('count(' || quote_ident(attname) || ')', ', ')
|| 'FROM ' || attrelid::regclass
FROM pg_attribute
WHERE attrelid = 'mytbl'::regclass
AND attnum >= 1 -- exclude tableoid & friends (neg. attnum)
AND attisdropped is FALSE -- exclude deleted columns
GROUP BY attrelid;
回报:
SELECT count(col1), count(col2), count(col3), ...
FROM mytbl
您也可以自动执行它。 但不是在计划 SQL 中,您需要在 plpgsql 函数或DO
语句(PostgreSQL 9.0 或更高版本)中EXECUTE
。
string_agg()
函数还需要 Postgres 9.0 或更高版本。 在旧版本中,您可以替换: array_to_string(array_agg(...), ', ')
。
您可能想知道特殊演员'mytbl'::regclass
。 在手册中阅读有关对象标识符类型的更多信息。
顺便说一句:默认情况下, NULL
值不会添加到COUNT(col)
中。
用(模式限定的)表名mytbl
。 在您的情况下,应该是:
...
WHERE attrelid = 'geoproject.mes_wastab'::regclass
...
如果您应该使用混合大小写或其他混乱的标识符(请注意引号):
...
WHERE attrelid = '"gEopRoject"."MES_wastab"'::regclass
...
我想要这个问题的动态解决方案,因此,使用@Erwin 提出的查询,这是一个只需要表和模式名称并输出如下表的函数:
columns, percentage
------------------
colname1, perc1
colname2, perc2
...
colnamen, percn
CREATE OR REPLACE FUNCTION public.completeness_histogram(_tabella text, _schema text)
RETURNS TABLE(columns text, percentage numeric)
LANGUAGE plpgsql
AS $function$
declare
seed_query text;
col_list text;
intermediate_query text;
final_query text;
begin
SELECT 'SELECT ' || string_agg(concat('round(100 * count(', col
, ') / count(*)::numeric, 2) AS ', col_pct), E'\n , ')
|| E'\nFROM ' || tbl into seed_query
FROM (
SELECT quote_ident(table_schema) || '.' || quote_ident(table_name) AS tbl
, quote_ident(column_name) AS col
, quote_ident(column_name) AS col_pct
FROM information_schema.columns
WHERE table_name = _tabella
and table_schema = _schema
ORDER BY ordinal_position
) sub
GROUP BY tbl;
select string_agg(col_pct, ', ') into col_list
from (
SELECT quote_ident(column_name) AS col_pct
FROM information_schema.columns
WHERE table_name = _tabella
and table_schema = _schema
ORDER BY ordinal_position
) foo;
intermediate_query := format('SELECT ''SELECT * FROM unnest(
''''{%s}''''::text[]
, '' || string_agg(quote_literal(ARRAY[%s])
|| ''::numeric[]'', E''\n, '')
|| E'') \n AS t(col, completezza)'' AS sql
FROM (
%s
) foo;', col_list, col_list, seed_query);
execute format(intermediate_query) into final_query;
return query execute format(final_query);
end;
$function$
;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.