回答

收藏

PostgreSQL:如何合并多行?

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

我有一个这样的表来保存体检的结果以及发送报告的日期和结果。实际上,发送的日期是基于临床访问日期。客户可以拥有一个或多个报告(日期可能有所不同)) f  e. ]# p& P# \
---------------------------------------
6 t2 K3 {9 v: p  [% q|  client_id  |  date_sent  | result |
; `/ m- f9 I' T, m* }5 p# [% \4 v: t---------------------------------------
8 G) g- [. `! C: @| 1           |   2001      |    A   |
9 ~  d: w4 B9 H( z- Q| 1           |   2002      |    B   |& Q" V& S: H; u/ n
| 2           |   2002      |    D   |
4 P& a* w. [# j. H5 E4 h| 3           |   2001      |    A   |
( I5 y0 d) L5 X* E5 C| 3           |   2003      |    C   |
' m- H$ o( o! R. M' B- }6 A| 3           |   2005      |    E   |, Y! l. l( o4 k1 I: q8 H' `2 K/ }
| 4           |   2002      |    D   |3 J6 @+ h& z( N- N2 F" o
| 4           |   2004      |    E   |
/ w- f, _- a. M1 I, a| 5           |   2004      |    B   |/ J& f" y2 I, c2 e+ A6 F
---------------------------------------' t& `; [  q5 G' v& h9 h
我想从上述数据中提取以下报告。5 k, _3 Z# ~# G; X/ z& |
---------------------------------------------------8 L$ k) q6 e* r* [. i" J
|  client_id  |  result1  |  result2  |   resut3  |% c5 P5 _8 U5 K% m+ d- z' I4 ~
---------------------------------------------------3 v' u6 W% W6 \; O0 ~8 q" Z
|      1      |    A      |    B      |           |; c# P; @/ s, E2 c
|      2      |    D      |           |           |
, \! ^+ S1 S* W: k, R/ v6 z9 B|      3      |    A      |    C      |     E     |+ s; T4 Q3 ~% W! i  h9 @
|      4      |    D      |    E      |           |7 O. p$ c2 E: i. m
|      5      |    B      |           |           |4 s& ]$ D/ z# p8 w& ?: _$ H
---------------------------------------------------& K1 V$ D; H  U( |
我正在研究Postgresql。“交叉表”功能在这里无法使用,因为每个客户端的“ date_sent”不一致。
$ b8 ?& X; @( C# [" R任何人都可以粗略地提出一个应如何查询的想法吗?7 u6 W. P6 e0 w( r3 L: g
               
' G+ V0 W, h/ Q1 j& A% q  N解决方案:
4 ]) p7 f% v: i' t               
0 p, ~! B% G) P" L  Z) Y! z& u# \' ^2 l" L" t: {
2 J) S+ T/ g/ ^7 l
                我建议采用以下方法:
9 I, G% R5 U- r' L, y5 d. ~SELECT client_id, array_agg(result) AS results1 j1 I% ]" y' g3 R1 [) Q
    FROM labresults
3 q" G: \) W# l' z7 G2 p, ~- [) B9 U    GROUP BY client_id;) ]' z) g3 Y9 `# B
它的输出格式不完全相同,但是它将为您提供更快,更干净的相同信息。0 n; J6 @  g: k) J/ M" E& k
如果要将结果放在单独的列中,则始终可以执行以下操作:9 b0 X2 U9 a: Q) b9 y
SELECT client_id,( X! F5 Q6 C0 H; {$ z  Q' [
       results[1] AS result1,
, B2 \$ t' E# J+ M2 \       results[2] AS result2,  s: L1 O1 x1 L8 m/ X) y
       results[3] AS result3
% ^4 b1 C3 V  @% ~: `' h; ?FROM
1 m; G5 B! `  }) Q) F7 W($ A: P* c" O) s% E$ {2 s' r  c5 P
    SELECT client_id, array_agg(result) AS results
3 [6 e! E- G& x6 K9 r        FROM labresults' `. u3 g8 q: G- m# A: k2 {1 O) O
        GROUP BY client_id $ u& e; }" N  L" ^# e
) AS r* i9 c, t$ Y; T, g) e1 @8 C
ORDER BY client_id;
9 n5 l) ?8 K; v. j尽管这显然会引入可能结果的硬编码数量。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则