PostgreSQL: как объединить несколько строк? - PullRequest
14 голосов
/ 30 сентября 2010

У меня есть такая таблица, чтобы сохранить результаты медицинского осмотра, дату отправленного отчета и результат. На самом деле отправленная дата основана на дате clinic_visit. Клиент может иметь один или несколько отчетов (дата может отличаться)

---------------------------------------
|  client_id  |  date_sent  | result |
---------------------------------------
| 1           |   2001      |    A   |
| 1           |   2002      |    B   |
| 2           |   2002      |    D   |
| 3           |   2001      |    A   |
| 3           |   2003      |    C   |
| 3           |   2005      |    E   |
| 4           |   2002      |    D   |
| 4           |   2004      |    E   |
| 5           |   2004      |    B   |
---------------------------------------

Я хочу извлечь следующий отчет из приведенных выше данных.

---------------------------------------------------
|  client_id  |  result1  |  result2  |   resut3  |
---------------------------------------------------
|      1      |    A      |    B      |           |
|      2      |    D      |           |           |
|      3      |    A      |    C      |     E     |
|      4      |    D      |    E      |           |
|      5      |    B      |           |           |
---------------------------------------------------

Я работаю над Postgresql. функция «перекрестная таблица» здесь не будет работать, потому что «date_sent» не согласован для каждого клиента

Может кто-нибудь дать примерное представление о том, как его следует запрашивать?

Ответы [ 2 ]

15 голосов
/ 02 июля 2011

Я предлагаю следующий подход:

SELECT client_id, array_agg(result) AS results
    FROM labresults
    GROUP BY client_id;

Это не совсем тот же формат вывода, но он даст вам ту же информацию гораздо быстрее и чище.

Если вам нужны результаты в отдельных столбцах, вы всегда можете сделать это:

SELECT client_id,
       results[1] AS result1,
       results[2] AS result2,
       results[3] AS result3
FROM
(
    SELECT client_id, array_agg(result) AS results
        FROM labresults
        GROUP BY client_id 
) AS r
ORDER BY client_id;

хотя это, очевидно, приведет к жестко запрограммированному числу возможных результатов.

0 голосов
/ 30 сентября 2010

Пока я читал об имитации row_number, я пытался найти другой способ сделать это.

SELECT client_id,  
       MAX( CASE seq WHEN 1 THEN result ELSE '' END ) AS result1,  
       MAX( CASE seq WHEN 2 THEN result ELSE '' END ) AS result2,  
       MAX( CASE seq WHEN 3 THEN result ELSE '' END ) AS result3,  
       MAX( CASE seq WHEN 4 THEN result ELSE '' END ) AS result4,  
       MAX( CASE seq WHEN 5 THEN result ELSE '' END ) AS result5  
FROM ( SELECT p1.client_id, 
              p1.result,  
              ( SELECT COUNT(*)  
                FROM labresults p2  
                WHERE p2.client_id = p1.client_id  
                AND p2.result <= p1.result )  
       FROM labresults p1 
) D ( client_id, result, seq )  
GROUP BY client_id;  

, но запрос занял 10 минут (500 000 мс ++).за 30000 записей.Это слишком долго ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...