2012-01-13 5 views
0

테이블에서 동일한 속성을 가진 그룹을 선택하고 싶습니다. 다른 사람이 아닌 예를 들어, 내 표는 각 facs_run_idfcj_id의 다른 조합을 가지고이 표에서 다음내에서 동일한 조합의 하위 쿼리

facs_run_id | fcj_id 
    1  |  17 
    1  |  4 
    1  |  12 
    2  |  17 
    2  |  4 
    2  |  12 
    3  |  17 
    3  |  12 
    3  |  10 

처럼, 일부는 facs_run_id 숫자 사이에 공유됩니다. 예를 들어, facs_run_id2이 동일하고 3fcj_id을 공유하지만 12과 동일하지 않습니다.

  1. 가 동일한 fcj_id 조합이있는 모든 facs_run_id을 찾을 특정 facs_run_id
  2. 에서 모든 fcj_id를 수집 : 나는에 질의를하고 싶습니다.

여기에서, 나는 facs_run_id: 1-fcj_id 조합 동일한 모든 facs_run_id를 찾으려면, 그래서 2 (또는 1 & 2)를 반환해야합니다.

심지어 어떤 fcj_id이 함께 누락 찾을 특정 fcj_id 및 누락 된 것을 얻을 수 있습니다 :

SELECT facs_run_id 
FROM facs_panel 
EXCEPT 
SELECT fcj_id 
FROM facs_panel 
WHERE facs_run_id = 2; 

나이 :

SELECT row(fp.*, fcj.fcj_antigen, fcj.fcj_color) 
FROM facs_panel fp 
     LEFT OUTER JOIN facs_conjugate_lookup fcj ON fcj.fcj_id = fp.fcj_id 
WHERE fp.fcj_id in (SELECT fp.fcj_id 
         FROM facs_panel fp 
         WHERE fp.facs_run_id = 1); 

하지만 쿼리를 만들 수 없습니다 오전 ID을 반환합니다. 이것은 집계 된 중복을 찾는 방법으로 간주 될 수 있다고 생각하지만, 어떻게 해야할지 모르겠습니다. 모든 제안 또는 포인터 크게 (또는이 유형의 쿼리가 작동하지 않는 경우 테이블을 만드는 더 나은 방법) 감사하겠습니다.

답변

0

그것은 몇 CTE를 꽤 쉽게 :

with f1 as (select 
       facs_run_id, 
       array_agg(fcj_id) as flist 
       from facs_panel 
       group by facs_run_id), 
    f2 as (select flist, count(*) 
       from f1 
       group by flist 
       having count(*) > 1) 
select f2.flist, f1. facs_run_id 
    from f2 
    join f1 on (f2.flist = f1.flist) 
    order by flist, facs_run_id; 

질문의 데이터,이 쿼리를 통해 실행, 생산 :

flist | facs_run_id 
-----------+------------- 
{4,12,17} |   1 
{4,12,17} |   2 
(2 rows) 
+0

대단히 감사합니다! 방금 당신의 대답을 찾았지만,이 모든 것을 다시 할 준비가되었습니다. 고맙습니다. – user1148636