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