PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Postgres - Транспониране на редове в колони

Използвайте crosstab() от модула 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);

Използвах цитиране на долари за първия параметър, който няма специално значение. Просто е удобно да избягвате единични кавички в низа на заявката, което е често срещан случай:

  • Вмъкнете текст с единични кавички в PostgreSQL

Подробно обяснение и инструкции:

  • PostgreSQL Crosstab Query

И по-специално за "допълнителни колони":

  • Завъртане на множество колони с помощта на Tablefunc

Специалните трудности тук са:

  • Липсата на ключови имена.
    --> Заменяме с row_number() в подзаявка.

  • Различният брой имейли.
    --> Ограничаваме до макс. от три във външния SELECT
    и използвайте crosstab() с два параметъра, предоставящ списък с възможни ключове.

Обърнете внимание на NULLS LAST в ORDER BY .




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Какво точно прави pg_escape_string?

  2. Актуализиране на времевата марка, когато редът се актуализира в PostgreSQL

  3. Колко различен е PostgreSQL от MySQL?

  4. Грешка при създаване на разширение без акцент на PostgreSQL

  5. Как да автоматизирате PostgreSQL 12 репликация и отказ с repmgr – част 2