T-SQL 如何在不考虑输入参数的情况下拉取上一行

T-SQL How to pull previous row regardless of the entered parameters

我正在处理打印再入院患者就诊信息的报告。

T-SQL查询根据IIF语句(使用LEADLAG)打印重复访问,查看是否有访问在同一位患者就诊入院日期后的 30 天内 - 简单地说 1 表示是,0 表示否 (AS 'ReadmittedFilter'),并且当没有输入任何参数时,我可以按预期看到所有数据。查询如下:

,IIF(   (IIF(((xxUnitNumber.UnitNumber = LEAD(xxUnitNumber.UnitNumber) OVER (PARTITION BY xxUnitNumber.UnitNumber ORDER BY xxUnitNumber.UnitNumber, RAM.AccountNumber) 
        AND xxUnitNumber.UnitNumber = LAG(xxUnitNumber.UnitNumber) OVER (PARTITION BY xxUnitNumber.UnitNumber ORDER BY xxUnitNumber.UnitNumber, RAM.AccountNumber))
        AND ((DATEDIFF(DAY,LAG(RART.RegistrationTypeDischargeDateTime) OVER (PARTITION BY xxUnitNumber.UnitNumber ORDER BY xxUnitNumber.UnitNumber, RAM.AccountNumber),RAM.AdmitDateTime) BETWEEN 0 AND 30))),
        DATEDIFF(DAY,LAG(RART.RegistrationTypeDischargeDateTime) OVER (PARTITION BY xxUnitNumber.UnitNumber ORDER BY xxUnitNumber.UnitNumber, RAM.AccountNumber),RAM.AdmitDateTime),0) 

        = IIF(((xxUnitNumber.UnitNumber = LEAD(xxUnitNumber.UnitNumber) OVER (PARTITION BY xxUnitNumber.UnitNumber ORDER BY xxUnitNumber.UnitNumber, RAM.AccountNumber) 
        AND xxUnitNumber.UnitNumber = LAG(xxUnitNumber.UnitNumber) OVER (PARTITION BY xxUnitNumber.UnitNumber ORDER BY xxUnitNumber.UnitNumber, RAM.AccountNumber))
        AND ((DATEDIFF(DAY,LAG(RART.RegistrationTypeDischargeDateTime) OVER (PARTITION BY xxUnitNumber.UnitNumber ORDER BY xxUnitNumber.UnitNumber, RAM.AccountNumber),RAM.AdmitDateTime) BETWEEN 0 AND 30))),
        DATEDIFF(DAY,LAG(RART.RegistrationTypeDischargeDateTime) OVER (PARTITION BY xxUnitNumber.UnitNumber ORDER BY xxUnitNumber.UnitNumber, RAM.AccountNumber),RAM.AdmitDateTime), 0)) 

    AND (IIF(((xxUnitNumber.UnitNumber = LEAD(xxUnitNumber.UnitNumber) OVER (PARTITION BY xxUnitNumber.UnitNumber ORDER BY xxUnitNumber.UnitNumber, RAM.AccountNumber) 
    OR xxUnitNumber.UnitNumber = LAG(xxUnitNumber.UnitNumber) OVER (PARTITION BY xxUnitNumber.UnitNumber ORDER BY xxUnitNumber.UnitNumber, RAM.AccountNumber))
    AND ((DATEDIFF(DAY,LAG(RART.RegistrationTypeDischargeDateTime) OVER (PARTITION BY xxUnitNumber.UnitNumber ORDER BY xxUnitNumber.UnitNumber, RAM.AccountNumber),RAM.AdmitDateTime) BETWEEN 0 AND 30))),

DATEDIFF(DAY,LAG(RART.RegistrationTypeDischargeDateTime) OVER (PARTITION BY xxUnitNumber.UnitNumber ORDER BY xxUnitNumber.UnitNumber, RAM.AccountNumber),RAM.AdmitDateTime),
DATEDIFF(DAY,RART.RegistrationTypeDischargeDateTime, LEAD(RAM.AdmitDateTime) OVER (PARTITION BY xxUnitNumber.UnitNumber ORDER BY xxUnitNumber.UnitNumber, RAM.AccountNumber))) BETWEEN 0 AND 30),

1,0) AS 'ReadmittedFilter'

我正在插入所有数据 INTO #tblTempCalculations 然后我做

SELECT *  
FROM #tblTempCalculations 
WHERE #tblTempCalculations.ReadmittedFilter = 1 

仅打印 'ReadmittedFilter'

中有 1 个的患者

但是,一旦我添加了日期范围(或任何其他参数),在许多情况下,它们会从打印输出中删除之前的访问。我想要实现的是强制打印患者之前的访问,即使它不适合输入的参数,并且参数仅适用于当前访问。

我将查询保存到存储过程中,并在 SSRS 2014 端生成具有不同参数的报告。

例如

目前没有参数:

Patient    VisitID  AdmitDate  DischargeDate PrevDisDate DaysBtwnVisits
John Doe   10001    10/1/13    10/5/13       NULL        NULL 
John Doe   10014    10/7/13    10/10/13      10/5/13     2
Jean All   10003    10/2/13    10/6/13       NULL        NULL
Jean All   10018    10/11/13   10/17/13      10/6/13     5
Jane Smith 10035    11/1/13    11/4/13       NULL        NULL
Jane Smith 10042    11/22/13   11/25/13      11/4/13     18

当前使用的参数:

输出:

Patient   VisitID  AdmitDate  DischargeDate PrevDisDate DaysBtwnVisits
John Doe  10004    10/7/13    10/10/13      10/5/13     2
Jean All  10018    10/11/13   10/17/13      10/6/13     5

我如何需要它使用参数:

输出:

Patient   VisitID  AdmitDate  DischargeDate PrevDisDate DaysBtwnVisits
John Doe  10001    10/1/13    10/5/13       NULL        NULL 
John Doe  10004    10/7/13    10/10/13      10/5/13     2
Jean All  10003    10/2/13    10/6/13       NULL        NULL
Jean All  10018    10/11/13   10/17/13      10/6/13     5

如果需要更多信息来对此进行调查,请告诉我。

谢谢。

Dq

编辑 4 - [最终工作] 查询:

    ;WITH xxUnitNumber (UnitNumber,VisitID,SourceID) AS 
        (SELECT 
        CASE RAM.Facility_MisFacID
        WHEN 'LOA' THEN (Select HRMRN.PrefixMedicalRecordNumber from livefdb.dbo.HimRec_MedicalRecordNumbers HRMRN where RAM.SourceID = HRMRN.SourceID and RAM.PatientID = HRMRN.PatientID and HRMRN.MrnPrefixID = 'LO') 
        WHEN 'LUA' THEN (Select HRMRN.PrefixMedicalRecordNumber from livefdb.dbo.HimRec_MedicalRecordNumbers HRMRN where RAM.SourceID = HRMRN.SourceID and RAM.PatientID = HRMRN.PatientID and HRMRN.MrnPrefixID = 'LU') 
        ELSE NULL END,RAM.VisitID,RAM.SourceID
        FROM [livefdb].[dbo].[RegAcct_Main] RAM)

SELECT  
    RAM.AccountNumber
    ,xxUnitNumber.UnitNumber
    ,RAM.AdmitDateTime
    ,RART.RegistrationTypeDischargeDateTime AS 'DischargeDateTime'
    ,IIF(   (IIF(((xxUnitNumber.UnitNumber = LEAD(xxUnitNumber.UnitNumber) OVER (PARTITION BY xxUnitNumber.UnitNumber ORDER BY xxUnitNumber.UnitNumber, RAM.AccountNumber) 
            AND xxUnitNumber.UnitNumber = LAG(xxUnitNumber.UnitNumber) OVER (PARTITION BY xxUnitNumber.UnitNumber ORDER BY xxUnitNumber.UnitNumber, RAM.AccountNumber))
            AND ((DATEDIFF(DAY,LAG(RART.RegistrationTypeDischargeDateTime) OVER (PARTITION BY xxUnitNumber.UnitNumber ORDER BY xxUnitNumber.UnitNumber, RAM.AccountNumber),RAM.AdmitDateTime) BETWEEN 0 AND 30))),
            DATEDIFF(DAY,LAG(RART.RegistrationTypeDischargeDateTime) OVER (PARTITION BY xxUnitNumber.UnitNumber ORDER BY xxUnitNumber.UnitNumber, RAM.AccountNumber),RAM.AdmitDateTime),0) 

            = IIF(((xxUnitNumber.UnitNumber = LEAD(xxUnitNumber.UnitNumber) OVER (PARTITION BY xxUnitNumber.UnitNumber ORDER BY xxUnitNumber.UnitNumber, RAM.AccountNumber) 
            AND xxUnitNumber.UnitNumber = LAG(xxUnitNumber.UnitNumber) OVER (PARTITION BY xxUnitNumber.UnitNumber ORDER BY xxUnitNumber.UnitNumber, RAM.AccountNumber))
            AND ((DATEDIFF(DAY,LAG(RART.RegistrationTypeDischargeDateTime) OVER (PARTITION BY xxUnitNumber.UnitNumber ORDER BY xxUnitNumber.UnitNumber, RAM.AccountNumber),RAM.AdmitDateTime) BETWEEN 0 AND 30))),
            DATEDIFF(DAY,LAG(RART.RegistrationTypeDischargeDateTime) OVER (PARTITION BY xxUnitNumber.UnitNumber ORDER BY xxUnitNumber.UnitNumber, RAM.AccountNumber),RAM.AdmitDateTime), 0)) 

        AND (IIF(((xxUnitNumber.UnitNumber = LEAD(xxUnitNumber.UnitNumber) OVER (PARTITION BY xxUnitNumber.UnitNumber ORDER BY xxUnitNumber.UnitNumber, RAM.AccountNumber) 
        OR xxUnitNumber.UnitNumber = LAG(xxUnitNumber.UnitNumber) OVER (PARTITION BY xxUnitNumber.UnitNumber ORDER BY xxUnitNumber.UnitNumber, RAM.AccountNumber))
        AND ((DATEDIFF(DAY,LAG(RART.RegistrationTypeDischargeDateTime) OVER (PARTITION BY xxUnitNumber.UnitNumber ORDER BY xxUnitNumber.UnitNumber, RAM.AccountNumber),RAM.AdmitDateTime) BETWEEN 0 AND 30))),

    DATEDIFF(DAY,LAG(RART.RegistrationTypeDischargeDateTime) OVER (PARTITION BY xxUnitNumber.UnitNumber ORDER BY xxUnitNumber.UnitNumber, RAM.AccountNumber),RAM.AdmitDateTime),
    DATEDIFF(DAY,RART.RegistrationTypeDischargeDateTime, LEAD(RAM.AdmitDateTime) OVER (PARTITION BY xxUnitNumber.UnitNumber ORDER BY xxUnitNumber.UnitNumber, RAM.AccountNumber))) BETWEEN 0 AND 30),

    1,0) AS 'ReadmittedFilter'

    ,IIF(xxUnitNumber.UnitNumber = LAG(xxUnitNumber.UnitNumber) OVER (PARTITION BY xxUnitNumber.UnitNumber ORDER BY xxUnitNumber.UnitNumber, RAM.AccountNumber),DATEDIFF(DAY,LAG(RART.RegistrationTypeDischargeDateTime) OVER (PARTITION BY xxUnitNumber.UnitNumber ORDER BY xxUnitNumber.UnitNumber, RAM.AccountNumber),RAM.AdmitDateTime),IIF(IIF(xxUnitNumber.UnitNumber = LEAD(xxUnitNumber.UnitNumber) OVER (PARTITION BY xxUnitNumber.UnitNumber ORDER BY xxUnitNumber.UnitNumber, RAM.AccountNumber) OR xxUnitNumber.UnitNumber = LAG(xxUnitNumber.UnitNumber) OVER (PARTITION BY xxUnitNumber.UnitNumber ORDER BY xxUnitNumber.UnitNumber, RAM.AccountNumber),ROW_NUMBER() OVER (PARTITION BY xxUnitNumber.UnitNumber ORDER BY xxUnitNumber.UnitNumber, RAM.AccountNumber),NULL) >= 1,0,NULL)) 'Days'
    ,IIF(xxUnitNumber.UnitNumber = LEAD(xxUnitNumber.UnitNumber) OVER (PARTITION BY xxUnitNumber.UnitNumber ORDER BY xxUnitNumber.UnitNumber, RAM.AccountNumber) OR xxUnitNumber.UnitNumber = LAG(xxUnitNumber.UnitNumber) OVER (PARTITION BY xxUnitNumber.UnitNumber ORDER BY xxUnitNumber.UnitNumber, RAM.AccountNumber),ROW_NUMBER() OVER (PARTITION BY xxUnitNumber.UnitNumber ORDER BY xxUnitNumber.UnitNumber, RAM.AccountNumber),NULL) AS 'VisitCount'
    ,IIF(xxUnitNumber.UnitNumber = LAG(xxUnitNumber.UnitNumber) OVER (PARTITION BY xxUnitNumber.UnitNumber ORDER BY xxUnitNumber.UnitNumber, RAM.AccountNumber),LAG(RART.RegistrationTypeDischargeDateTime) OVER (PARTITION BY xxUnitNumber.UnitNumber ORDER BY xxUnitNumber.UnitNumber, RAM.AccountNumber),NULL) AS 'PrevDisDate'


INTO #tblTempCalculations

    FROM [livefdb].[dbo].[RegAcct_Main] RAM 
    INNER JOIN livefdb.dbo.RegAcct_RegistrationTypes RART ON RART.SourceID = RAM.SourceID AND RART.VisitID = RAM.VisitID AND RART.RegistrationTypeKey_MisRegTypeID = 'IN'
    INNER JOIN xxUnitNumber ON xxUnitNumber.VisitID = RAM.VisitID AND xxUnitNumber.SourceID = RAM.SourceID

    WHERE       RAM.SourceID = 'LOF'
    AND     RAM.ServiceInpatient_MisSvcID NOT IN ('REH','SNF')
    AND     RAM.Location_MisLocID NOT IN ('LO MB',' LO NB','LO SCN1')

    ORDER BY xxUnitNumber.UnitNumber, RAM.AccountNumber

    SELECT 
*
,ROW_NUMBER() OVER(PARTITION BY #tblTempCalculations.UnitNumber ORDER BY #tblTempCalculations.UnitNumber, #tblTempCalculations.AccountNumber DESC) as 'VisitRowCount'

进入#tblTempCalculations2

FROM #tblTempCalculations 

WHERE 
#tblTempCalculations.UnitNumber IN (SELECT UnitNumber FROM #tblTempCalculations WHERE #tblTempCalculations.ReadmittedFilter = 1 AND CONVERT(VARCHAR(10), #tblTempCalculations.DischargeDateTime, 111) BETWEEN @FromDischargeDate AND @ThroughDischargeDate)
 AND #tblTempCalculations.Facility = @Facility      

ORDER BY #tblTempCalculations.UnitNumber, #tblTempCalculations.AccountNumber

SELECT *
FROM #tblTempCalculations2
WHERE #tblTempCalculations2.VisitRowCount < 3
ORDER BY #tblTempCalculations2.UnitNumber, #tblTempCalculations2.AccountNumber

DROP TABLE #tblTempCalculations
DROP TABLE #tblTempCalculations2

试试这个:

SELECT TOP 2 UnitNumber,
       Patient,   
       VisitID,  
       AdmitDate,  
       DischargeDate, 
       PrevDisDate, 
       DaysBtwnVisits  
FROM #tblTempCalculations AS T1
WHERE T1.ReadmittedFilter = 1 AND
      T1.UnitNumber IN
      (SELECT UnitNumber
       FROM #tblTempCalculations AS T2
       WHERE DischargeDate BETWEEN @FromDischargeDate AND @ThroughDischargeDate)
ORDER BY DischargeDate DESC