回答

收藏

PostgreSQL:如何合并多行?

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

我有一个这样的表来保存体检的结果以及发送报告的日期和结果。实际上,发送的日期是基于临床访问日期。客户可以拥有一个或多个报告(日期可能有所不同)
$ e* n2 ]3 h1 c- ^. l! W---------------------------------------
3 H2 D. C  L- P* }3 m0 U|  client_id  |  date_sent  | result |
# F& X  O6 ]6 j/ D2 a---------------------------------------0 r, U( U% E* @7 x
| 1           |   2001      |    A   |
9 q6 {. I# j. m9 h- P9 N1 J& Q* r| 1           |   2002      |    B   |
. ~# o9 q* c& T# a  k0 C" `2 U: @| 2           |   2002      |    D   |
# q0 S% s" e3 t  b" k% c| 3           |   2001      |    A   |* ~& m( Z* Y5 C! q  d& i
| 3           |   2003      |    C   |
6 }) }$ H( K1 t! v3 ^| 3           |   2005      |    E   |  W. w& _! {0 a
| 4           |   2002      |    D   |/ }& y; J- M9 |6 ^4 F
| 4           |   2004      |    E   |2 \+ M# s% B6 I8 R2 T: T7 Y
| 5           |   2004      |    B   |4 _$ g8 B* |, N9 Q7 ]/ _
---------------------------------------$ o1 [& \3 a8 H. t
我想从上述数据中提取以下报告。
, K' V: P9 V2 t2 G+ s---------------------------------------------------
( O9 Z+ t) M- j; \3 B|  client_id  |  result1  |  result2  |   resut3  |% X4 D% \9 ^9 G* v* p
---------------------------------------------------3 W! m) a- e/ O: p7 O
|      1      |    A      |    B      |           |
. T9 g. s0 j* |7 ^6 Z  k|      2      |    D      |           |           |$ z6 _2 B: u* @. o' n
|      3      |    A      |    C      |     E     |3 K  `, i% x& N1 {8 X; e4 |
|      4      |    D      |    E      |           |
0 y  f/ L' [- T4 K+ b1 S7 n|      5      |    B      |           |           |* L9 ?- A3 _$ X4 j
---------------------------------------------------
2 C  @5 s& p. {& G4 |1 T; J5 p7 v$ l我正在研究Postgresql。“交叉表”功能在这里无法使用,因为每个客户端的“ date_sent”不一致。; ^: h% X, K: A* y  ^2 z# Z1 m
任何人都可以粗略地提出一个应如何查询的想法吗?
% V3 X- R. J2 I( s                - I5 q( B& o7 ^4 ]3 B3 E, a
解决方案:3 g) C3 ^* K) {) T6 B5 t4 j
                6 n3 [0 P& R8 p

. d! f1 D0 D1 b( L+ j$ v. }, x  R& S$ f1 S9 w2 o2 p' \5 V
                我建议采用以下方法:. W, T, Q+ d! R0 Z  H; p: [3 U$ f2 J
SELECT client_id, array_agg(result) AS results/ J0 A( }8 W# Q0 Z8 i5 p
    FROM labresults+ z% E0 c; S0 y" i, B6 _, q& o' t! ^
    GROUP BY client_id;) x: N5 E! \' o' r1 W2 s( a
它的输出格式不完全相同,但是它将为您提供更快,更干净的相同信息。1 f  g6 F8 K- Z% P
如果要将结果放在单独的列中,则始终可以执行以下操作:
( o6 j  V5 K* |! e) MSELECT client_id,6 i! z; Q2 n, Z. [$ |1 @
       results[1] AS result1,
$ X* m! B0 H/ o7 ^       results[2] AS result2,
8 J8 u- o9 Y" w       results[3] AS result3
$ m( k/ v7 r7 kFROM1 W: G$ O, O7 F& @( O) ?  g$ r! z
(! Y1 S. Z1 V0 j6 k, P
    SELECT client_id, array_agg(result) AS results
' ~$ R7 ~2 C! n        FROM labresults3 h, t0 p& T9 |8 h9 N7 L( p9 l" |: M
        GROUP BY client_id
( u7 r1 _5 `6 c1 ~5 k2 I; D+ a, G+ e$ ?/ k) AS r, d( J5 z* m* I( r1 j( C
ORDER BY client_id;
% h4 @( x) G$ I, C尽管这显然会引入可能结果的硬编码数量。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则