【发布时间】:2014-08-03 05:21:27
【问题描述】:
我有一个使用找到的答案 here 构建的查询,它非常有帮助。我添加了一些东西来满足我的需要。我添加的其中一件事是ROW_NUMBER(),以便计算某人在 30 天内在任何时间长度内被重新接纳的次数。我已按照第一个答案和问题that was posted here 中的建议将cte 结果插入到临时表中。这并没有解决思想,序列长度和序列计数问题。
这是查询:
-- CREATE TABLE TO STORE CTE RESULTS
DECLARE @PPR TABLE(
VISIT1 VARCHAR(20) -- THIS IS A UNIQUE VALUE
, READMIT VARCHAR(20) -- THIS IS A UNIQUE VALUE
, MRN VARCHAR(10) -- THIS IS UNIQUE TO A PERSON
, INIT_DISC DATETIME
, RA_ADM DATETIME
, R1 INT
, R2 INT
, INTERIM1 VARCHAR(20)
, RA_COUNT INT
, FLAG VARCHAR(2)
);
-- THE CTE THAT WILL GET USED TO POPULATE THE ABOVE TABLE
WITH cte AS (
SELECT PTNO_NUM
, Med_Rec_No
, Dsch_Date
, Adm_Date
, ROW_NUMBER() OVER (
PARTITION BY MED_REC_NO
ORDER BY PtNo_Num
) AS r
FROM smsdss.BMH_PLM_PtAcct_V
WHERE Plm_Pt_Acct_Type = 'I'
AND PtNo_Num < '20000000'
)
-- INSERT CTE RESULTS INTO PPR TABLE
INSERT INTO @PPR
SELECT
c1.PtNo_Num AS [INDEX]
, c2.PtNo_Num AS [READMIT]
, c1.Med_Rec_No AS [MRN]
, c1.Dsch_Date AS [INITIAL DISCHARGE]
, c2.Adm_Date AS [READMIT DATE]
, C1.r
, C2.r
, DATEDIFF(DAY, c1.Dsch_Date, c2.Adm_Date) AS INTERIM1
, ROW_NUMBER() OVER (
PARTITION BY C1.MED_REC_NO
ORDER BY C1.PTNO_NUM ASC
) AS [RA COUNT]
, CASE
WHEN DATEDIFF(DAY, c1.Dsch_Date, c2.Adm_Date) <= 30
THEN 1
ELSE 0
END [FLAG]
FROM cte C1
INNER JOIN cte C2
ON C1.Med_Rec_No = C2.Med_Rec_No
WHERE C1.Adm_Date <> C2.Adm_Date
AND C1.r + 1 = C2.r
ORDER BY C1.Med_Rec_No, C1.Dsch_Date
-- MANIPULATE PPR TABLE
SELECT PPR.VISIT1
, PPR.READMIT
, PPR.MRN
, PPR.INIT_DISC
, PPR.RA_ADM
--, PPR.R1
--, PPR.R2
, PPR.INTERIM1
--, PPR.RA_COUNT
, PPR.FLAG
-- THE BELOW DOES NOT WORK AT ALL
, CASE
WHILE (SELECT PPR.INTERIM1 FROM @PPR PPR) <= 30
BEGIN
ROW_NUMBER() OVER (PARTITION BY PPR.MRN, PPR.VISIT1
ORDER BY PPR.VISIT1
)
IF (SELECT PPR.INTERIM1 FROM @PPR PPR) > 30
BREAK
END
END
FROM @PPR PPR
WHERE PPR.MRN = 'A NUMBER'
电流输出示例:
INDEX | READMIT | MRN | INIT DISCHARGE | RA DATE | INTERIM | RACOUNT | FLAG | FLAG_2
12345 | 12349 | 123 | 2005-07-05 | 2005-07-09| 4 | 1 | 1 | 0
12349 | 12351 | 123 | 2005-07-11 | 2005-07-15| 4 | 2 | 1 | 0
所以第三行显然不是 30 天内的重新入院,而只是患者返回医院的时间点,因此 RA_Count 回到 1 并且标志变为 0,因为它不是 30 天的重新入院。
我应该创建一个表而不是使用cte吗?
我想添加的是链长和链数。以下是一些定义:
链长:某人在后续访问后的 30 天内连续被重新接纳了多少次。
例如
INDEX | READMIT | MRN | INITIAL DISCHARGE | READMIT DATE | CHAIN LEN | Count
123 | 133 | 1236 | 2009-05-13 | 2009-06-12 | 1 | 1
133 | 145 | 1236 | 2009-06-16 | 2009-07-04 | 2 | 1
145 | 157 | 1236 | 2009-07-06 | 2009-07-15 | 3 | 1
165 | 189 | 1236 | 2011-01-01 | 2011-01-12 | 1 | 2
189 | 195 | 1236 | 2011-02-06 | 2011-03-01 | 2 | 2
链数将是有多少链:所以在上表中将有 2。我正在尝试使用 case 语句来确定链的长度
这是一个 SQL Fiddle,其中包含一些示例数据,因为它将在执行 CTE 之前出现 SQL Fiddle
谢谢,
【问题讨论】:
-
这还能运行吗?
SELECT ... CASE WHILE ... -
CASE不,它没有,我从未使用过它,正在尝试不同的东西 -
@MCP_infiltrator 你有没有机会用你的一些数据创建一个 sql fiddle?
-
我现在就试试看
-
更新了 sql fiddle sqlfiddle.com/#!3/9f807/1
标签: sql sql-server-2008-r2 parent-child common-table-expression row-number