Category: SQL

  • SNOMED 코드 치환

    Athena 에서 SNOMED 코드를 검색하면 편하다. 링크를 타고 다른 것들도 검색해 볼 수 있다. 그런데 검색을 하면 시간이 많이 소요된다. 이럴 경우에는 SNOMED 파일을 받아서 직접 검색을 하면 빠르다. 이렇게 vocabulary 파일을 받아서 DB에 import 할 경우 다음 사항을 고려해야 한다.

    • CSV가 아닌 TSV로 파일이 생성된다. 수 많은 콤마가 있는 것을 고려하면 당연한 것이다.
    • 겹 따옴표와 홑 따옴표가 모두 사용된다. 이것은 import 과정에서 예외 처리에 영향을 미쳐서 불완전하게 데이터가 들어온다.

    concept_name에서 따옴표는 대세에 영향을 주지 않기 때문에 삭제한 후 import 시키도록 한다.

    sed -i "s/\"//g" CONCEPT.csv
    sed -i "s/\'//g" CONCEPT.csv
  • 세션 종료

    PostgreSQL에서 일정 시간 사용하지 않는 세션을 종료하는 방법은 다음과 같다고 한다. 주기적으로 실행시키기 위해서는 해당 명령을 실행할 수 있도록 cron 에 등록시켜서 하면 된다.

    SELECT pg_terminate_backend(pid)
    FROM pg_stat_activity
    WHERE state = 'idle'
          AND state_change < now() - '15min'::interval;
  • Schema와 Table 이름 확인하기

    PostgreSQL에서 Table 이름을 확인하려면 \dt 명령어를 입력하라는 것을 쉽게 찾을 수 있다. 그런데 뭐가 문제인지 relation을 찾을 수 없다는 메시지만 나온다. 이럴 경우에 확인할 수 있는 방법이다.

    SELECT * FROM pg_catalog.pg_tables WHERE schemaname != 'pg_catalog' AND schemaname != 'information_schema';
  • partition by

    특정 값을 기준으로 그룹으로 나눈 후 최소값이나 최대값 혹은 평균값 등을 구한다고 생각해보자. 아마 group by 로 구하면 되지 않을까 생각이 들것이다. 그런데 group by 로 하면 생각보다 문제가 풀리지 않는다. 이와 관련된 해결책을 찾다가 stackoverflow 에서 다음의 글을 찾았다. 여기에는 4가지 방법을 제시하고 있는데, 나는 이 중에서 group by 를 이용하지 않는 첫 번째 방법을 이용했다. 첫 번째를 선택한 이유는 코드가 짧기 때문이다. 😉

    https://stackoverflow.com/questions/13325583/postgresql-max-and-group-by

    medein=# select datetime, rain_type from (select datetime, rain_type, input_time, max(input_time) over (partition by datetime) from work.weather_long where rain_type is not null) as b where input_time = max order by datetime;