2013-11-23 3 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; 

쿼리를 작성할 때 모든 열의 이름을 알고 있으면 충분합니다.

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

그 그러나을 : 당신이 임의의 테이블에 대한 데이터를 찾고 있다면

, 당신은 (당신이 관련된 다른 수준을 볼 수 있도록 내가 공백을 충분히 추가 한) SQL을 통해 SQL 문을 구축 할 필요가 필요한 SQL 문의 텍스트 일뿐입니다. PostgreSQL에 액세스하는 방법에 따라 새 쿼리에 쉽게 제공하거나 PostgreSQL에서 모든 것을 유지하는 경우 통합 된 절차 언어 중 하나를 사용해야합니다. 우수한 (복잡한 것은 아니지만) discussion of the issues이 지침을 제공 할 수 있습니다.