如何解决Sql 如何使用两个临时表将嵌套 while 循环转换为 CTE
我有一个临时表,它从 dx codes
的抽象表和帐号的注册表中提取。它按 VisitID
连接,dx codes
按 DiagnosisUrn - #Visits
我需要将它加入Diag
表。此表中的 dx codes
是主要的计费对象,在
按 Transaction Number ID
排序,最小的数字是最主要的。
最后,对于每个 visit id,account id,
我需要打印出 Dx codes
像这个例子:
Account ICD10 SequenceNumber
AT000118 R06.00 1
AT000118 I25.10 2
AT000118 I65.23 3
AT000118 E11.29 4
AT000118 Z95.1 5
AT000118 E11.65 6
AT000118 E78.2 7
AT000118 E78.1 8
AT000118 E11.42 9
对于这个特定帐户(还有许多其他类似的帐户),所有 dx
都在 Visit
表中
但是只有前四个在 Diag
表中,并带有正确的 TransactionDiagnosisURN/DiagnosisURN/Sequence Number
While 循环重新排序访问临时表中 DX codes
的其余部分,并将它们添加到 Diag
表中的末尾,结果填充 PBdxcodes
临时表表。
它需要按日期范围运行 - 我已将其更改为提取一些帐号以尝试处理 一个 CTE。使用循环会导致它运行很长时间,有时它只是超时。
我在尝试将查询转换为 CTE 时遇到递归错误。过去我只用过基本的 CTE,已经有一段时间了。
下面是使用 while 循环的查询,然后我尝试将一个循环转换为 CTE: 虽然循环: 声明 @NumofVisits 为 INT 声明 @NumberofTxs 为 INT 声明 @Looper 为 INT 声明 @ThisVisitID 为 VARCHAR(35)
DROP TABLE IF EXISTS #Visits
SELECT disTINCT
RAM.VisitID,RAM.AccountNumber,ADX.DiagnosisCode_MisDxID,CAST(ADX.DiagnosisUrnID AS INT) AS ABSdxcode
INTO #Visits
FROM livefdb.dbo.AbsAcct_Diagnoses ADX
JOIN livefdb.dbo.RegAcct_Main AS RAM
ON RAM.VisitID = ADX.VisitID
AND RAM.sourceID = ADX.sourceID
AND RAM.Facility_MisFacID NOT IN ('KK','JFJ','MPM')
AND RAM.RegistrationType_MisRegTypeID IN ('AMB','AMBR','BNV')
LEFT JOIN livefdb.dbo.HimRec_Main AS HRM
ON HRM.sourceID = RAM.sourceID
AND HRM.PatientID = RAM.PatientID
WHERE ADX.VisitID IN ('LE1-B20210114114749175','AT0-B20191211155403251','ID0-B20201201104450465','OM1-B20210107093907435','AT0-B20191205154143298','LE0-B20200716135146384','PC1-B20210111125154209','SV1-B20210112122435108','UB0-B20200915140417079','ID1-B20201222150226545'
)
SET @NumofVisits = (SELECT COUNT(disTINCT VisitID) FROM #Visits )
-- Create a table to hold Dx data for each visit
DROP TABLE IF EXISTS #PBdxcodes
CREATE TABLE #PBdxcodes (
EncounterRecordNumber VARCHAR(18),ICD10DiagnosisCode VARCHAR(15),SequenceNumber INT,)
-- Get the Diagnosis from BAR Transactions. The least transaction number is the Primary Charge
-- and the Diagnosis Codes are the Primary Diagnosis codes
WHILE @NumofVisits > 0
BEGIN
DROP TABLE IF EXISTS #UpdateDiag
CREATE TABLE #UpdateDiag (
DiagnosisUrnID INT IDENTITY(1,1) PRIMARY KEY,VisitID VARCHAR(35),Diagnosis_MisDxID VARCHAR(50)
)
SET @ThisVisitID = (SELECT TOP 1 VisitID FROM #Visits)
SELECT disTINCT
BATD.VisitID,BATD.TransactionNumberID,CAST(BATD.TransactionDiagnosisUrnID AS INT) AS TransactionDiagnosisUrnID,BATD.TransactionDiagnosis_MisDxID
INTO #Diag
FROM livefdb.dbo.Baracct_TxnDiagnoses AS BATD
WHERE BATD.VisitID = @ThisVisitID
SET @NumberofTxs = (SELECT COUNT(disTINCT TransactionNumberID) FROM #Diag)
SET @Looper = 0
WHILE ( @NumberofTxs > @Looper)
BEGIN
INSERT INTO #UpdateDiag(VisitID,Diagnosis_MisDxID)
SELECT
VisitID,TransactionDiagnosis_MisDxID
FROM #Diag
WHERE TransactionNumberID =
(CASE WHEN 1 = (SELECT COUNT(disTINCT TransactionNumberID) FROM #Diag)
THEN (SELECT TOP 1 TransactionNumberID FROM #Diag )
ELSE (SELECT MIN(TransactionNumberID) FROM #Diag)
END)
AND TransactionDiagnosis_MisDxID NOT IN (SELECT Diagnosis_MisDxID FROM #UpdateDiag)
ORDER BY TransactionDiagnosisUrnID
DELETE FROM #Diag WHERE TransactionNumberID = (SELECT MIN(TransactionNumberID) FROM #Diag)
SET @Looper = @Looper + 1
END
-- Are there Diagnosis in Abstracting that are not in BAR
INSERT INTO #UpdateDiag(VisitID,Diagnosis_MisDxID)
SELECT
VisitID,DiagnosisCode_MisDxID
FROM #Visits
WHERE #Visits.VisitID = @ThisVisitID
AND #Visits.DiagnosisCode_MisDxID NOT IN (SELECT Diagnosis_MisDxID FROM #UpdateDiag)
ORDER BY #Visits.ABSdxcode
-- Add this visit to the temp table holding final results
INSERT INTO #PBdxcodes (EncounterRecordNumber,SequenceNumber,ICD10DiagnosisCode,SourceSystem)
SELECT disTINCT
#Visits.AccountNumber AS EncounterRecordNumber,#UpdateDiag.DiagnosisUrnID AS SequenceNumber,#UpdateDiag.Diagnosis_MisDxID AS ICD10DiagnosisCode
FROM #UpdateDiag
INNER JOIN #Visits ON #UpdateDiag.VisitID = #Visits.VisitID
DELETE FROM #Visits WHERE VisitID = @ThisVisitID
SET @NumofVisits = @NumofVisits - 1
DROP TABLE #Diag,#UpdateDiag
END
SELECT * FROM #PBdxcodes
WHERE EncounterRecordNumber='AT0001184503'
ORDER BY EncounterRecordNumber,SequenceNumber
DROP TABLE #Visits,#PBdxcodes
CTE Attempt:
DECLARE @NumofVisits AS INT
DECLARE @NumberofTxs AS INT
DECLARE @Looper AS INT
DECLARE @ThisVisitID AS VARCHAR(35)
--Get VisitID,Account Nos and Dx in Abstracting.
DROP TABLE IF EXISTS #Visits
SELECT disTINCT
RAM.VisitID,CAST(ADX.DiagnosisUrnID AS INT) AS ABSdxcode
INTO #Visits
FROM livefdb.dbo.AbsAcct_Diagnoses ADX
JOIN livefdb.dbo.RegAcct_Main RAM
ON ADX.sourceID=RAM.sourceID
AND ADX.VisitID=RAM.VisitID
AND RAM.Facility_MisFacID NOT IN ('KK','MPM')
AND RAM.RegistrationType_MisRegTypeID IN ('AMB','BNV')
WHERE ADX.VisitID IN ('AT0-B20191211155403251','LE1-B20210114114749175')
SET @NumofVisits = (SELECT COUNT(disTINCT VisitID) FROM #Visits);
WITH CTE AS (
SELECT
V.ABSdxcode,@NumofVisits AS n,V.VisitID,V.DiagnosisCode_MisDxID
FROM #Visits V
UNION ALL
SELECT
C.ABSdxcode,C.n+1,V.VisitID AS VisitID,V.DiagnosisCode_MisDxID
FROM CTE C
INNER JOIN #Visits AS V ON V.VisitID=C.VisitID
)
SELECT C.ABSdxcode,C.DiagnosisCode_MisDxID
FROM CTE C
WHERE C.n=(SELECT MAX(n) FROM CTE WHERE ABSdxcode=C.ABSdxcode)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。