2013-11-23 28 views
2

我想查找表格每列中不同值的数量。声明性地说:Postgres:查找每列不同值的数量

for each column of table xyz 
run_query("SELECT COUNT(DISTINCT column) FROM xyz")  

查找表的列名显示为here

SELECT column_name 
FROM information_schema.columns 
WHERE table_name=xyz 

但是,我不设法合并计数查询里面。我试过各种查询,这一个:

SELECT column_name, thecount 
FROM information_schema.columns, 
    (SELECT COUNT(DISTINCT column_name) FROM myTable) AS thecount 
WHERE table_name=myTable 

在语法上是不允许的(引用不允许在嵌套查询中的column_name)。

这一次似乎也错误(超时):

SELECT column_name, count(distinct column_name) 
FROM information_schema.columns, myTable 
WHERE table_name=myTable 

什么是让不同值的数量与一个查询表中的每一列的正确方法?

文章SQL to find the number of distinct values in a column只讨论固定列。

回答

0

一般来说,SQL需要一个语句中的项目(字段,表,角色,索引,约束等)的名称是常量。许多数据库系统让你通过诸如information_schema之类的东西来检查结构并不意味着你可以将该数据插入正在运行的语句中。

然而,您可以使用information_schema来构造您单独执行的新SQL语句。

首先考虑你的原始问题。

CREATE TABLE foo (a numeric, b numeric, c numeric); 

INSERT INTO foo(a,b,c) 
    VALUES (1,1,1), (1,1,2), (1,1,3), (1,2,1), (1,2,2); 

SELECT COUNT(DISTINCT a) "distinct a", 
     COUNT(DISTINCT b) "distinct b", 
     COUNT(DISTINCT c) "distinct c" 
    FROM foo; 

如果您在编写查询时知道所有列的名称,那就足够了。

如果您是一个任意表求数据,您需要通过SQL来构造SQL语句(我已经添加了很多空白的,所以你可以看到涉及的不同级别):

SELECT 'SELECT ' || STRING_AGG( 'COUNT (DISTINCT ' 
           || column_name 
           || ') "' 
           || column_name 
           || '"', 
           ',') 
       || ' FROM foo;' 
    FROM information_schema.columns 
WHERE table_name='foo'; 

然而那只是必需的SQL语句的文本。根据您访问Postgresql的方式,您可能很容易将它提供给新查询,或者如果您将所有内容都保存在Postgresql中,那么您将不得不求助于其中一种集成过程语言。一个出色的(虽然很复杂)discussion of the issues可能会提供指导。