我有一张这样的表来保存体检结果和发送报告的日期以及结果.实际上发送的日期是基于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 |
---------------------------------------
Run Code Online (Sandbox Code Playgroud)
我想从以上数据中提取以下报告.
---------------------------------------------------
| client_id | result1 | result2 | resut3 |
---------------------------------------------------
| 1 | A | B | |
| 2 | D | | |
| 3 | A | C | E |
| 4 | D | E | |
| 5 | B | | |
---------------------------------------------------
Run Code Online (Sandbox Code Playgroud)
我正在研究Postgresql."交叉表"功能在此处不起作用,因为每个客户端的"date_sent"不一致.
任何人都可以大致了解应该如何查询?
Pet*_*aut 16
我建议采用以下方法:
SELECT client_id, array_agg(result) AS results
FROM labresults
GROUP BY client_id;
Run Code Online (Sandbox Code Playgroud)
它的输出格式不完全相同,但它可以更快,更清晰地为您提供相同的信息.
如果您希望将结果放在单独的列中,则可以始终执行以下操作:
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;
Run Code Online (Sandbox Code Playgroud)
虽然这显然会引入一些硬编码的可能结果.