2014-02-07 3 views
2
ID | user_id | name  | active 
1 | 1  | Profile 1 | f 
2 | 1  | Profile 2 | t 
3 | 2  | Profile 3 | f 
4 | 2  | Profile 4 | f 
5 | 3  | Profile 5 | f 

저는 PostgreSQL을 사용하고 있습니다. 내 응용 프로그램에서 users은 복수 profiles을 만들 수 있으며 마지막으로 고유 한 비활성 프로필을 각 사용자가 만들도록 선택하려고합니다. 또한 해당 사용자가 속한 active 프로필이 있으면 해당 사용자의 프로필을 선택해서는 안됩니다. 나를 위해 어려운 부분이었습니다.고유 한 데이터를 얻기위한 SQL 문

다음 결과를 얻으려면 어떤 종류의 SQL 문을 사용해야합니까? distinct on 구문이 매우 잘 작동

4 | 2  | Profile 4 | f 
5 | 3  | Profile 5 | f 

답변

2

DISTINCT ONNOT EXISTS을 결합합니다. 활동에 대한 적절한 boolean 유형을 가정 :

SELECT DISTINCT ON (user_id) 
     id, user_id, name, active 
FROM profiles p 
WHERE NOT EXISTS (
    SELECT 1 FROM profiles 
    WHERE user_id = p.user_id 
    AND active    -- exclude users with any active profiles 
    ) 
ORDER BY user_id, id DESC; 

아마 가장 빠르고 깨끗한.

2

:

select distinct on (user_id) id, user_id, name, active 
from t 
where active = 'f' 
order by user_id, id desc; 

편집 :

select id, user_id, name, active 
from (select t.*, 
      row_number() over (partition by user_id, active order by id desc) as seqnum, 
      max(case when active = 'f' then 0 else 1 end) as numActives 
     from t 
    ) t 
where numActives = 0 and seqnum = 1; 
+0

활성 프로필이있는 사용자가있는 행을 선택해야합니다. –

+0

@ErenCAY. . . 그렇습니다, 그것은 별개의 것을 사용하는 것을 어렵게 만듭니다. 편집 된 버전을 참조하십시오. –

+0

@GordonLinoff numActives' –

2
:

활성 프로필, 아마 쉽게 분석 기능과 이동을 방지하기 위해

SQL Fiddle

select distinct on (user_id) 
    id, user_id, name, active 
from 
    t 
    inner join 
    (
     select user_id 
     from t 
     group by user_id 
     having not bool_or(active) 
    ) s using(user_id) 
order by user_id, id desc