복붙노트

[SQL] 포스트 그레스 - 컬럼에 트랜스 행

SQL

포스트 그레스 - 컬럼에 트랜스 행

나는 각 사용자에 대해 여러 개의 이메일 주소를 제공하는 다음과 같은 테이블을 가지고있다.

나는 사용자 쿼리에 열이 밖으로 평평해야합니다. 나에게 작성 날짜를 기준으로 "최신"3 개 이메일 주소를 제공합니다.

user.name | user.id | email1          | email2           | email3**

Mary      | 123     | mary@gmail.com  | mary@yahoo.co.uk | mary@test.com

Joe       | 345     | joe@gmail.com   | [NULL]           | [NULL]

해결법

  1. ==============================

    1.tablefunc 모듈 ()에서 크로스 탭을 사용하십시오.

    tablefunc 모듈 ()에서 크로스 탭을 사용하십시오.

    SELECT * FROM crosstab(
       $$SELECT user_id, user_name, rn, email_address
         FROM  (
            SELECT u.user_id, u.user_name, e.email_address
                 , row_number() OVER (PARTITION BY u.user_id
                                ORDER BY e.creation_date DESC NULLS LAST) AS rn
            FROM   usr u
            LEFT   JOIN email_tbl e USING (user_id)
            ) sub
         WHERE  rn < 4
         ORDER  BY user_id
       $$
      , 'VALUES (1),(2),(3)'
       ) AS t (user_id int, user_name text, email1 text, email2 text, email3 text);
    

    나는 특별한 의미가 없습니다 첫 번째 매개 변수에 대한 달러 인용 부호 사용. 당신이 일반적인 경우입니다 쿼리 문자열에 작은 따옴표를 탈출해야하는 경우 그냥 편리합니다 :

    여기에 설명과 지침을 상세 :

    특히, "여분의 열"에 대한 :

    여기에 특별한 어려움은 다음과 같습니다 :

    BY 순서로 NULLS LAST에주의하십시오.

  2. ==============================

    2.발견이 질문에 당신이 열 정의되지 않은 번호가있는 곳을위한 동적 솔루션을 필요로 정확히 3에 트랜스가 아닌 것을 다른 사람이, 당신이 좋은 솔루션을 여기에서 찾아 낼 수있는 경우 : https://github.com/jumpstarter-io/ colpivot

    발견이 질문에 당신이 열 정의되지 않은 번호가있는 곳을위한 동적 솔루션을 필요로 정확히 3에 트랜스가 아닌 것을 다른 사람이, 당신이 좋은 솔루션을 여기에서 찾아 낼 수있는 경우 : https://github.com/jumpstarter-io/ colpivot

  3. from https://stackoverflow.com/questions/23060256/postgres-transpose-rows-to-columns by cc-by-sa and MIT license