T-SQL 如何在不考虑输入参数的情况下拉取上一行
T-SQL How to pull previous row regardless of the entered parameters
我正在处理打印再入院患者就诊信息的报告。
T-SQL查询根据IIF
语句(使用LEAD
和LAG
)打印重复访问,查看是否有访问在同一位患者就诊入院日期后的 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
当前使用的参数:
@FromDischargeDate = '10/10/13'
@ThroughDischargeDate = '10/30/13'
输出:
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
我如何需要它使用参数:
@FromDischargeDate = '10/10/13'
@ThroughDischargeDate = '10/30/13'
输出:
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
我正在处理打印再入院患者就诊信息的报告。
T-SQL查询根据IIF
语句(使用LEAD
和LAG
)打印重复访问,查看是否有访问在同一位患者就诊入院日期后的 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
当前使用的参数:
@FromDischargeDate = '10/10/13'
@ThroughDischargeDate = '10/30/13'
输出:
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
我如何需要它使用参数:
@FromDischargeDate = '10/10/13'
@ThroughDischargeDate = '10/30/13'
输出:
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