我有以下数据
sk_patient casenumber src status pen_dt
-1 2345 POPDB CLOSED 2012-01-01
-1 235 POPDB CLOSED 2012-01-01
-1 245 JCARE CLOSED 2012-01-02
1244 2 POPDB CLOSED 2012-01-01
273 2345 POPDB CLOSED 2012-03-04
1244 23 JCARE CLOSED 2012-05-02
需要根据不同的src
列值将其转换为以下内容。
sk_patient casenumber1 src1 status1 pen_dt1 casenumber2 src2 status2 pen_dt2
-1 2345 POPDB CLOSED 2012-01-01 245 JCARE CLOSED 2012-01-02
-1 235 POPDB CLOSED 2012-01-01 NULL NULL NULL NULL
1244 2 POPDB CLOSED 2012-01-01 23 JCARE CLOSED 2012-05-02
273 2345 POPDB CLOSED 2012-03-04 NULL NULL NULL NULL
例如,
对于-1
,我们有3行,但其中有两行具有相同的src
,所以我们将它们原样,但3行具有不同的值。因此,需要将其移动到src2
列以及相关的列值。
对于任何特定src
,最小1和最多3个不同sk_patient
可以关联。
===更新===
直到现在,我能够做到以下
seq sk_patient casenumber src status pen_dt
2 -1 2345 POPDB CLOSED 2012-01-01
2 -1 235 POPDB CLOSED 2012-01-01
1 -1 245 JCARE CLOSED 2012-01-02
2 1244 2 POPDB CLOSED 2012-01-01
1 273 2345 POPDB CLOSED 2012-03-04
1 1244 23 JCARE CLOSED 2012-05-02
我使用了以下查询
select dense_rank()
over(partition by sk_patient order by sk_patient, src) as seq,
* from patient
如上例所示,有人可以帮助我移动价值吗?
答案 0 :(得分:0)
SELECT tp1.sk_patient,
tp1.casenumber casenumber1,
tp1.src src1,
tp1.status status1,
tp1.pen_dt pen_dt1,
tp2.casenumber2,
tp2.src2,
tp2.status2,
tp2.pen_dt2
FROM t_patient tp1
LEFT OUTER JOIN (SELECT sk_patient,
MAX(CASE WHEN rnum = 1 THEN casenumber END) casenumber1,
MAX(CASE WHEN rnum = 1 THEN src END) src1,
MAX(CASE WHEN rnum = 1 THEN status END) status1,
MAX(CASE WHEN rnum = 1 THEN pen_dt END) pen_dt1,
MAX(CASE WHEN rnum = 2 THEN casenumber END) casenumber2,
MAX(CASE WHEN rnum = 2 THEN src END) src2,
MAX(CASE WHEN rnum = 2 THEN status END) status2,
MAX(CASE WHEN rnum = 2 THEN pen_dt END) pen_dt2
FROM (SELECT *,
DENSE_RANK() OVER (PARTITION BY sk_patient ORDER BY src DESC) rnum
FROM t_patient
) t
GROUP BY sk_patient
) tp2
ON tp1.sk_patient = tp2.sk_patient
AND tp1.casenumber = tp2.casenumber1
AND tp1.src = tp2.src1
WHERE tp1.src != 'JCARE'
结果
sk_patient casenumber1 src1 status1 pen_dt1 casenumber2 src2 status2 pen_dt2
-1 2345 POPDB CLOSED 2012-01-01 245 JCARE CLOSED 2012-01-02
-1 235 POPDB CLOSED 2012-01-01 NULL NULL NULL NULL
1244 2 POPDB CLOSED 2012-01-01 23 JCARE CLOSED 2012-05-02
273 2345 POPDB CLOSED 2012-03-04 NULL NULL NULL NULL