PostgreSQL 쿼리 작성 문의드립니다.

   조회 3441   추천 0    

갑자기 PostgreSQL로 구성된 DB에서 자료를 추출하여 분석을 해야하는 연구를 해야합니다. ㅠㅠ

인터넷 검색을 통하여 원하는 조건을 검색하는 스크립트(?)는 작성하였습니다.

SELECT DISTINCT person_id
FROM hlud.condition_occurrence
WHERE (condition_source_value LIKE '%A15%'
OR condition_source_value LIKE '%A16%'
OR condition_source_value LIKE '%A17%'
OR condition_source_value LIKE '%A18%'
OR condition_source_value LIKE '%A19%')

hlud 스키마의 condition_occurrence 테이블의 condition_source_value 컬럼에서 A15~A19 단어가 포함된 것중 중복값을 제외한 person_id를 구하였습니다.

질문은 2개입니다.

첫번째로 여기서 검색된 person_id 는 다른 테이블에도 있는데요, 이 person_id가 있는 다른 테이블의 자료를 선택하기 위해서는 어떻게 해야하는지요?

두번째로 선택된 테이블 정보를 R에서 불러와서 분석을 진행할 것인데 어떻게 해야 DB의 자료를 R로 넘길 수 있는지 궁금합니다.

감사합니다.

추신: 연구비에서 제 인건비를 받게 된다면 소정의 사례를 하겠습니다.

짧은글 일수록 신중하게.
엠브리오 2019-03
1. join 이 필요하겠네요.
2. psql 에서 쿼리 결과를 파일로 저장하는 옵션이 있을겁니다.
select a.person_id,보이고고싶은 컬럼명
FROM hlud.condition_occurrence A inner join huld.tmp_table B on A.person_id=B.person_id
where (A.condition_source_value LIKE '%A15%' OR A.condition_source_value LIKE '%A16%'
          OR A.condition_source_value LIKE '%A17%'  OR A.condition_source_value LIKE '%A18%'
          OR A.condition_source_value LIKE '%A19%')
group by a.person_id,보이고고싶은 컬럼명
--------------------------
이런식으로 하시면 될거고 like 보다는 in ('A15','A16') 이런식이 쿼리결과는 빠를겁니다.
문제는 A15, A16 값들 압뒤로 자리수가 같으면 substring 같은 함수로 뽑아서 IN을 사용하시기 바랍니다.
참조 -> https://lee-mandu.tistory.com/431
substring(condition_source_value,2,3) in ('A15','A16) 이런식 숫자로 조정 가능한 구조인지 파악필요
양철괭이 2019-03
1. 보통은 join이나 두개 테이블을 동시에 select 합니다.
select A.id, B.id from tablenameA as A, tablenameB as B where A.id=B.id
대충 이런식이 될듯
2. 쿼리문을 가지고 내보내기나 자료 생성을 할수 있는 툴이 있을겁니다

제가 주종목이 ms sql이라 정확하지는 않겠지만 대다수 디비들보통 쿼리문은 표준식으로 비슷합니다
김상일 2019-03
select *
from 다른 테이블
where person_id in (
SELECT DISTINCT person_id
FROM hlud.condition_occurrence
WHERE (condition_source_value LIKE '%A15%'
OR condition_source_value LIKE '%A16%'
OR condition_source_value LIKE '%A17%'
OR condition_source_value LIKE '%A18%'
OR condition_source_value LIKE '%A19%')
group by person_id
)

오라클에서는 이렇게 처리했었는데...
아님 join으로..
변선주 2019-03
모든 분들께 감사드립니다. 1번 문제 해결에 매우 큰 도움이 되었습니다.
1번 문제는 다음과 같은 방법으로 해결하였습니다.

select * from hlud.visit_occurrence where person_id in (
SELECT DISTINCT person_id
FROM hlud.condition_occurrence
WHERE substring(condition_source_value, 1, 3) in ('A15', 'A16', 'A17', 'A18', 'A19')
)
     
DAP박인호 2019-03
앞 LIKE가 필요 없네요.
SELECT *
FROM hlud.visit_occurrence
WHERE person_id IN (
SELECT person_id
FROM hlud.condition_occurrence
WHERE condition_source_value SIMILAR TO 'A1(5|6|7|8|9)%'
)
이런식으로 바꿔보세요.
INDEX가 있다면 쿼리 속도가 빨라짐.
꼭 필요한 경우가 아니면 검색하는 컬럼을 조작하는 함수는 안쓰고
쿼리를 작성하는 것을 권장합니다.
DAP박인호 2019-03
SELECT *
FROM 다른테이블
WHERE person_id IN (
SELECT person_id
FROM hlud.condition_occurrence
WHERE condition_source_value SIMILAR TO '%A1(5|6|7|8|9)%'
)
이런식 입니다.
제가 PostgreSQL는 사용해 보지 않아서 패턴검색을 잘 모르는데
패턴검색을 사용하면 위 쿼리를 더 간단하게 바꿀수 있을 거예요.
     
변선주 2019-03
답변 감사합니다. 여기서 검색하는 A15~A19가 한국질병분류코드입니다. 질병에 따라서 시작 알파벳이 A인 경우도 있으나 B, Z 등에도 존재하는 경우가 있어서 패턴 검색까지는 곤란할 것 같습니다. 약간 느려도 직관적인 방법으로 짜야 나중에 다른 연구자들도 쓸 수 있을 것 같습니다.
          
DAP박인호 2019-03
직관적으로 하신다면
WHERE condition_source_value SIMILAR TO '(A15|A16|A17|A18|A19)%'
이런식으로 질병코드를 나열하시면 됩니다.
Midabo 2019-03
결핵연구하시나봐요!
     
변선주 2019-03
전공분야는 아닌데 자료를 다룰 수 있다보니 이쪽으로도 해보게 될 것 같습니다.


QnA
제목Page 1380/5723
2015-12   1760106   백메가
2014-05   5233689   정은준1
2019-03   4725   twopaik
2019-03   3573   사랑하라
2019-03   4397   tntnt
2019-03   3228   행복하세
2019-03   3562   Sunrise
2019-03   2808   Psychophysi…
2019-03   2952   풍경1
2019-03   2822   YUNCOM
2019-03   3571   그린
2019-03   6711   김건우
2019-03   10031   사랑하라
2019-03   3655   VSPress
2019-03   3107   봄들판에서다
2019-03   6309   페르세우스
2019-03   3195   송진현
2019-03   3718   김건우
2019-03   3838   가을바람
2019-03   3011   지인환
2019-03   6148   JCnetwork
2019-03   3461   헌터D