【问题标题】:count distinct values in column for all columns in a tables in single query在单个查询中计算表中所有列的不同值
【发布时间】:2020-10-14 16:41:56
【问题描述】:

一种快速有效地计算表中所有列的不同值的方法。在单个查询中

请注意

  1. 我有只读权限。
  2. 在一个架构中,我有多个表,我想计算其中一些表,但不是全部

【问题讨论】:

    标签: sql vertica


    【解决方案1】:

    我假设最困难的情况 - 当您不能依赖表名的子字符串时。

    在这种情况下 - 创建您的架构/表列表,并使用它来创建一个构建一个大脚本的脚本,您最终可以在它生成后启动它:

    CREATE LOCAL TEMPORARY TABLE srch(table_schema,table_name) 
    ON COMMIT PRESERVE ROWS AS
              SELECT 'public','gen_sample'
    UNION ALL SELECT 'public','d_product'
    UNION ALL SELECT 'dbadmin','d_cust_scd'
    UNION ALL SELECT 'dbadmin','currencies'
    ;
    
    SELECT
        CASE ROW_NUMBER() OVER(ORDER BY c.table_schema,c.table_name,ordinal_position)
        WHEN 1 THEN ''
        ELSE 'UNION ALL '
        END
      ||'SELECT '''||c.table_schema||'.'||c.table_name||'.'||column_name||''','
      ||'COUNT(DISTINCT '||column_name||') FROM '||c.table_schema||'.'||c.table_name
    FROM columns c JOIN srch USING(table_schema,table_name);
    
    -- out  SELECT 'dbadmin.currencies.id',COUNT(DISTINCT id) FROM dbadmin.currencies
    -- out  UNION ALL SELECT 'dbadmin.currencies.nm',COUNT(DISTINCT nm) FROM dbadmin.currencies
    -- out  UNION ALL SELECT 'dbadmin.currencies.sgn',COUNT(DISTINCT sgn) FROM dbadmin.currencies
    -- out  UNION ALL SELECT 'dbadmin.d_cust_scd.cust_key',COUNT(DISTINCT cust_key) FROM dbadmin.d_cust_scd
    -- out  UNION ALL SELECT 'dbadmin.d_cust_scd.cust_id',COUNT(DISTINCT cust_id) FROM dbadmin.d_cust_scd
    -- out  UNION ALL SELECT 'dbadmin.d_cust_scd.cust_from_dt',COUNT(DISTINCT cust_from_dt) FROM dbadmin.d_cust_scd
    -- out  UNION ALL SELECT 'dbadmin.d_cust_scd.cust_to_dt',COUNT(DISTINCT cust_to_dt) FROM dbadmin.d_cust_scd
    -- out  UNION ALL SELECT 'dbadmin.d_cust_scd.cust_is_curr',COUNT(DISTINCT cust_is_curr) FROM dbadmin.d_cust_scd
    -- out  UNION ALL SELECT 'dbadmin.d_cust_scd.cust_cre_ts',COUNT(DISTINCT cust_cre_ts) FROM dbadmin.d_cust_scd
    -- out  UNION ALL SELECT 'dbadmin.d_cust_scd.cust_udt_ts',COUNT(DISTINCT cust_udt_ts) FROM dbadmin.d_cust_scd
    -- out  UNION ALL SELECT 'dbadmin.d_cust_scd.cust_fname',COUNT(DISTINCT cust_fname) FROM dbadmin.d_cust_scd
    -- out  UNION ALL SELECT 'dbadmin.d_cust_scd.cust_lname',COUNT(DISTINCT cust_lname) FROM dbadmin.d_cust_scd
    -- out  UNION ALL SELECT 'dbadmin.d_cust_scd.cust_phoneno',COUNT(DISTINCT cust_phoneno) FROM dbadmin.d_cust_scd
    -- out  UNION ALL SELECT 'dbadmin.d_cust_scd.cust_loy_lvl',COUNT(DISTINCT cust_loy_lvl) FROM dbadmin.d_cust_scd
    -- out  UNION ALL SELECT 'dbadmin.d_cust_scd.cust_org_id',COUNT(DISTINCT cust_org_id) FROM dbadmin.d_cust_scd
    -- out  UNION ALL SELECT 'public.d_product.prdkey',COUNT(DISTINCT prdkey) FROM public.d_product
    -- out  UNION ALL SELECT 'public.d_product.prdid',COUNT(DISTINCT prdid) FROM public.d_product
    -- out  UNION ALL SELECT 'public.d_product.start_date',COUNT(DISTINCT start_date) FROM public.d_product
    -- out  UNION ALL SELECT 'public.d_product.end_date',COUNT(DISTINCT end_date) FROM public.d_product
    -- out  UNION ALL SELECT 'public.d_product.price',COUNT(DISTINCT price) FROM public.d_product
    -- out  UNION ALL SELECT 'public.gen_sample.srr_key',COUNT(DISTINCT srr_key) FROM public.gen_sample
    -- out  UNION ALL SELECT 'public.gen_sample.seq',COUNT(DISTINCT seq) FROM public.gen_sample
    -- out  UNION ALL SELECT 'public.gen_sample.nucleotide',COUNT(DISTINCT nucleotide) FROM public.gen_sample
    -- out  UNION ALL SELECT 'public.gen_sample.quality',COUNT(DISTINCT quality) FROM public.gen_sample
    

    【讨论】:

      【解决方案2】:
      1. 您可以使用此查询来计算单个列的不同值。(请参阅查询 1)
      2. 对于多列,您必须使用 union all。(请参阅查询 2)

      查询 1 - 从 Your_ColumnName 的 Your_TableName 组中选择不同的 Your_ColumnName, count(*)

      查询 2 - 按 Your_ColumnName1 从 Your_TableName 组中选择不同的 Your_ColumnName1, count() 联合所有 从 Your_TableName 组中选择不同的 Your_ColumnName2, count() by Your_ColumnName2

      【讨论】:

      • 我正在寻找一种更有效的方法。最好在我不必运行多个查询的地方。
      猜你喜欢
      • 2019-10-11
      • 2018-02-16
      • 1970-01-01
      • 1970-01-01
      • 2021-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多