繁体   English   中英

计算表中每一列的值

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM