回答

收藏

PostgreSQL:如何合并多行?

技术问答 技术问答 249 人阅读 | 0 人回复 | 2023-09-14

我有一个这样的表来保存体检的结果以及发送报告的日期和结果。实际上,发送的日期是基于临床访问日期。客户可以拥有一个或多个报告(日期可能有所不同), x& v7 b! [( q. C/ X
---------------------------------------
8 O6 c. i7 x0 L: c; ~|  client_id  |  date_sent  | result |
3 W4 E$ G' P4 P3 |& [) E---------------------------------------' V% t6 t& v- j" ?  T0 p- Q2 v7 `1 q
| 1           |   2001      |    A   |
7 N$ o, {& s% ?1 k! C" s3 @| 1           |   2002      |    B   |1 ^" N. ]6 W; H$ \4 ^+ K2 k
| 2           |   2002      |    D   |+ M: n# E! M, ], p7 I9 g
| 3           |   2001      |    A   |
$ W/ E- w8 F4 ^: E. \" t| 3           |   2003      |    C   |
/ ~. w9 d  i  q' t9 ^( Z9 X| 3           |   2005      |    E   |! L4 d2 B) w% I" J7 ]
| 4           |   2002      |    D   |% ?( N. H* f# o2 O
| 4           |   2004      |    E   |- `4 L1 l5 G3 l9 P: U
| 5           |   2004      |    B   |
  t2 J8 L) Y( a3 K---------------------------------------
' M$ ^8 [- W: [8 p& _- k* x我想从上述数据中提取以下报告。
0 V( Z6 b6 c* g" a* M---------------------------------------------------/ T4 ^* E( d7 _3 V* j' x: s
|  client_id  |  result1  |  result2  |   resut3  |
, ~/ L6 v" E5 ?0 K+ z. B6 a2 e---------------------------------------------------
" l# [/ c% b0 Q# H|      1      |    A      |    B      |           |/ Y8 C7 B6 D/ h* y$ W8 f- K
|      2      |    D      |           |           |* e& e& G5 c! U! B5 c. {
|      3      |    A      |    C      |     E     |
4 Z3 y3 X1 J5 P  L) t|      4      |    D      |    E      |           |2 _' p- X8 f- W! Z& h. b
|      5      |    B      |           |           |) D  V* w4 ~& k- ~) L4 ^& a
---------------------------------------------------- G& P8 j- O8 N5 A( r$ v0 o
我正在研究Postgresql。“交叉表”功能在这里无法使用,因为每个客户端的“ date_sent”不一致。
0 ]9 T  @' Z/ x任何人都可以粗略地提出一个应如何查询的想法吗?
9 D" {! E# E2 _* D0 p  T( @! P% G                . v! A2 Q% \! S8 P% ~
解决方案:4 {  x& Y2 C& T
                : q3 O- Z8 i. d) J  _
2 `2 Z+ i+ W+ _! p) W
& B& G! F9 V6 A3 J% n+ [
                我建议采用以下方法:3 [! T( q3 x$ A" v1 `$ A; \" U
SELECT client_id, array_agg(result) AS results2 |5 c5 g& G. t0 R' l# r2 }
    FROM labresults
/ l" W" \1 Y% e2 n0 g% U    GROUP BY client_id;
  H5 }5 v2 z+ x5 o5 y& q它的输出格式不完全相同,但是它将为您提供更快,更干净的相同信息。) F# v& X2 I( A; x3 b% r
如果要将结果放在单独的列中,则始终可以执行以下操作:9 `4 j$ {+ x7 P3 ~2 J& T
SELECT client_id,
& X0 @  }9 l$ F. `) @       results[1] AS result1,
- J5 q$ D$ ?$ w4 Q8 z% L- p2 d       results[2] AS result2,/ ^) k' N. l1 H/ G2 a
       results[3] AS result3
) J' G  k  g: r" `FROM$ G4 A6 i: e" J, R
(
) ]1 a5 M' I; x2 _    SELECT client_id, array_agg(result) AS results, e7 A7 R9 ]  A* J- G1 }, p1 q
        FROM labresults9 s- |% v/ w' ?0 c) c
        GROUP BY client_id $ R2 H# g) `* t  y3 t/ h
) AS r
% J* n% U' F* O: ]3 a+ bORDER BY client_id;
" Q* j! ^' L" E# p7 Q  \. m# U尽管这显然会引入可能结果的硬编码数量。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则