我有一张这样的表来保存体检结果和发送报告的日期以及结果.实际上,发送的日期是基于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”对于每个客户端不一致,所以“交叉表”功能将不会工作.
任何人都可以提出一个粗略的想法应该如何查询?
我建议采用以下方法:
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;
虽然这显然会引入一些硬编码的可能结果.