|
我有一个这样的表来保存体检的结果以及发送报告的日期和结果。实际上,发送的日期是基于临床访问日期。客户可以拥有一个或多个报告(日期可能有所不同)
$ 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尽管这显然会引入可能结果的硬编码数量。 |
|