Postgres:查找每列的不同值的数量

时间:2013-11-23 17:41:04

标签: postgresql dynamic-sql

我试图在表的每列中找到不同值的数量。声明性地说:

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仅讨论固定列。

1 个答案:

答案 0 :(得分: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可能会提供指导。