2013-11-23 31 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可能會提供指導。