2014-07-03 39 views
0

我試圖在SQL中構建一個報告,顯示患者上次收到特定實驗室服務的時間以及他們收到該服務的設施。不幸的是,實驗室程序和設施處於不同的表格中。以下是我現在有(提前爲我的怪異走樣道歉,這讓因爲與實際的表名更好):加入兩個表中的兩個最新事件

;with temp as (Select distinct flow.pid, flow.labdate as obsdate, flow.labvalue as obsvalue 
      From labstable as flow 
      Where flow.name = 'lab name' 
     ) 
Select distinct p.patientid, MAX(temp.obsdate) [Last Reading], COUNT(temp.obsdate) [Number of Readings], 
Case 
When count(temp.obsdate) > 2 then 'Active'Else 'Inactive' End [Status], facility.NAME [Facility] 

From Patientrecord as p 
Join temp on temp.pid = p.PId 
Join (Select loc.name, MAX(a.apptstart)[Last appt], a.patientid 
    From Appointmentstable as a 
    Join Facility as loc on loc.facilityid = a.FacilityId 
    Where a.ApptStart = (Select MAX(appointments.apptstart) from Appointments where appointments.patinetId = a.patientid) 
    Group by loc.NAME, a.patientId 
    ) facility on facility.patientId = p.PatientId 

Group by p.PatientId, facility.NAME 
Having MAX(temp.obsdate) between DATEADD(yyyy, -1, GETDATE()) and GETDATE() 
Order by [Last Reading] asc 

我這個問題是,如果病人已經超過一個設施內在時間範圍內,子查詢將選擇每個設施加入連接,通過apprx 4000誇大結果。我需要找到一種方法,只從約會列表中選擇最新的設施,然後將其加入實驗室。實驗室沒有訪問ID(這會有很大意義)。我相當有信心,我在我的子查詢選擇或相應的加入中失去了一些東西,但在四天後,我認爲我需要專業幫助。

建議非常感謝,請讓我知道我可以澄清的地方。先謝謝你!

+0

嘗試使用'row_number' - http://msdn.microsoft.com/zh-CN/library/ms186734.aspx – podiluska

+0

更新:數據庫出現過濾錯誤,查詢現在每個用戶都返回一個設施。不確定是否適合更新或刪除,但是此查詢現在可以正常工作。 – user3629815

回答

0

別名爲「工廠」你的子查詢更改爲這樣的事情:

... 
join (
select patientid, loc_name, last_appt 
from (
    select patientid, loc_name=loc.name, last_appt=apptstart, 
     seqnum=row_number() over (partition by patientid order by apptstart desc) 
    from AppointmentsTable a 
    inner join Facility loc on loc.facilityid = a.facilityid 
) x 
where seqnum = 1 
) facility 
on ... 
... 

的主要區別是使用ROW_NUMBER()的窗函數。 「分區依據」和「按順序排列」子句保證您將爲每位患者獲得一組行數,並將最近日期的行分配給第1行。「seqnum = 1」的篩選可確保您獲得只有你想要的每一個病人的

+0

我建議同時單獨運行該子查詢,以便在將其集成到較大的查詢之前瞭解有關row_number()函數如何工作的更多信息。假設你使用的是SQL Server 2008或更高版本,你應該發現非常強大和非常方便的窗口函數。 – SlimsGhost

+0

謝謝,我想這正是我正在尋找的。我確實讓它運行了,但在接下來的幾個月裏我會碰到這個問題幾次,所以我很高興知道這個解決方案。 – user3629815