Sql 如何使用两个临时表将嵌套 while 循环转换为 CTE

问题描述

我有一个临时表,它从 dx codes 的抽象表和帐号的注册表中提取。它按 VisitID 连接,dx codesDiagnosisUrn - #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)

--获取 VisitID 以查找 Dx 代码

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 (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...