如何为每个visit_id记录在单独的列中将前4行值放入一行?

Chr*_*ssy 5 sql-server sql-server-2012

我有一张patient_visit_codes桌子上的字段:pat_id, visit_id, visit_date, visit_code, create_timestamp.每个患者可以在每个访问日期拥有无限的访问代码.每个visit_code都列在一个单独的行中.我想visit_code在单独的列中将前4个创建成一行.

所以如果我的表有以下数据:

;WITH patient_visit_codes AS (
SELECT * FROM (VALUES
(1, 'B58B3850-43BB-434D-B1EA-B968A01332EA', '2015-12-22', '3018F', '2015-12-22 07:24:07.403'),
(1, 'B58B3850-43BB-434D-B1EA-B968A01332EA', '2015-12-22', '1101F', '2015-12-22 07:28:09.440'),
(56, '482A73F8-EA3F-4CD6-B1AD-BD2388EC5912', '2016-01-05', 'I50', '2016-01-05 11:05:34.830'),
(56, '482A73F8-EA3F-4CD6-B1AD-BD2388EC5912', '2016-01-05', 'R50.90', '2016-01-05 11:35:14.560'),
(56, '482A73F8-EA3F-4CD6-B1AD-BD2388EC5912', '2016-01-05', 'Z02.89', '2016-01-05 11:40:24.740')
) as t (pat_id, visit_id, visit_date, visit_code, create_timestamp))
Run Code Online (Sandbox Code Playgroud)

我希望得到如下结果:

pat_id  | visit_id                              | visit_code1   | visit_code2   | visit_code3   | visit_code4 
1       | B58B3850-43BB-434D-B1EA-B968A01332EA  | 3018F         | 1101F         | Null          | Null 
56      | 482A73F8-EA3F-4CD6-B1AD-BD2388EC5912  | I50           | R50.90        | Z02.89        | Null 
Run Code Online (Sandbox Code Playgroud)

Jer*_*cho 0

使用 MS SQL 2012,我想出了下面的内容,应该可以为您提供所需的输出。它涉及创建一个子查询/CTE 以按日期对访问进行排名,然后创建 4 个自联接以将它们全部放入单个行条目中:

WITH cte
AS
    (SELECT pat_ID, visit_ID, visit_date, visit_code, create_timestamp,
        RANK() OVER(PARTITION BY pat_ID ORDER BY visit_date, create_timestamp) AS RankNo
    FROM #t)

SELECT a.pat_id, a.visit_id, a.visit_code AS visit_code1, b.visit_code AS visit_code2, 
    c.visit_code AS visit_code3, d.visit_code AS visit_code4
FROM cte AS a
LEFT JOIN
    (SELECT * FROM cte AS b WHERE b.RankNo = 2) AS b
ON a.pat_ID = b.pat_ID
LEFT JOIN
    (SELECT * FROM cte AS c WHERE c.RankNo = 3) AS c
ON a.pat_id = c.pat_ID
LEFT JOIN
    (SELECT * FROM cte AS d WHERE d.RankNo = 4) AS d
ON a.pat_ID = d.pat_ID
WHERE
    a.RankNo = 1
Run Code Online (Sandbox Code Playgroud)

对于 RANK() 函数,我对 Visit_date 和 create_timestamp 都进行了 ORDER BY 以消除联系...如果有可能 Visit_date 恰好是其创建的时间,您可能需要添加第三个 ORDER BY

这将提供所需的输出,但我还建议谷歌搜索 SQL 动态枢轴以查看替代解决方案