2016-06-07 237 views
0

我的輸入表patient_ID和Appt_Resource_ID(博士)(第二個表是剛開的患者姓名)查詢返回不正確的結果

Patient_ID  Appt_Resource_ID 
88299   47  
88299   1  
88299   40  
88299   40  
88299   40  
88299   40  

我運行一個,就是寫一個輸出行爲SQL patient_id和Doctor_ID發生的最多,在這種情況下是sb 40.但它正在輸出Doctor_ID 1.其他情況下,我檢查的操作是否正確。

這是查詢:

select distinct A.Patient_id, P.Patient_name, b.Appt_resource_id 
from [PM].[vwGenPatApptInfo] A 
inner join 
(
select top 100 percent patient_id, Appt_resource_id, count(Appt_resource_id) as DR_count, 
row_number() over (partition by patient_id order by count(*) desc) as seqnum 
from [PM].[vwGenPatApptInfo] 
where Patient_ID is NOT NULL 
group by patient_id,Appt_resource_id 
order by patient_id, seqnum 
) B on B.Patient_ID = A.Patient_ID 
and B.seqnum = 1 
inner join [PM].[vwGenPatInfo] P on A.Patient_id = P.Patient_id 
where A.Appt_DateTime >= DATEADD(yyyy, -2, GETDATE()) and A.Appt_Cancelled_Date is NULL 

但結果是這樣的:

Patient_ID   Appt_Resource_ID 
88299     1 

回答

0

試試這個。

SELECT TOP 1 * 
FROM (
    SELECT Patient_ID, Appt_Resource_ID, COUNT(*) AS theCount 
    FROM vwGenPatApptInfo 
    GROUP BY Patient_ID, Appt_Resource_ID 
    WHERE ApptDateTime >= DATEADD(yyyy, -2, GETDATE()) and Appt_Cancelled_Date is NULL 
) b 
JOIN vwGenPatInfo p ON p.Patient_ID = b.Patient_ID 
ORDER BY theCount DESC 
0

這是不是一個真正的答案,對不起。

你的子查詢找到最經常出現在病人身邊的醫生。 (如果您想要最常發生的患者/醫生對,請從ROW_NUMBER中刪除分區子句。)

但是,然後您再次加入vwGenPatApptInfo(作爲A)。爲什麼?而且,您的連接甚至不完整,因爲您只能通過Patient_ID加入,而不能通過Appt_resource_id加入。因此,您可以在每個日期範圍內將每位最常出現的醫生與患者的其他醫生記錄相結合。這些你再次用DISTINCT解僱。

我不明白你的查詢如何得到錯誤的醫生。如果您選擇了A.Appt_resource_id,那將是一個原因,但b.Appt_resource_id應該是最常發生的醫生。

我希望我的評論能夠幫助你。也許你可以以某種方式簡化你的查詢,也許甚至可以擺脫這個錯誤。

祝你好運!

0

它可能不是最完美的解決方案,但嘗試這個辦法:

;WITH CTE1 as (
    SELECT Patient_ID, Appt_Resource_ID 
     , COUNT(*) OVER (PARTITION BY Patient_ID, Appt_Resource_ID) as CNT 
    FROM [PM].[vwGenPatApptInfo] 
), CTE2 as (
    SELECT Patient_ID, Appt_Resource_ID, CNT, RANK() OVER 
     (PARTITION BY Patient_ID ORDER BY CNT DESC) AS Rank 
    FROM CTE1 
), CTE3 as (
    SELECT Patient_ID, Appt_Resource_ID, CNT, Rank 
    FROM CTE2 
    WHERE Rank = 1 
    GROUP BY Patient_ID, Appt_Resource_ID, CNT, Rank 
) 
select distinct A.Patient_id, P.Patient_name, b.Appt_resource_id, B.CNT 
from [PM].[vwGenPatApptInfo] A 
INNER JOIN CTE3 as B on B.Patient_ID = A.Patient_ID 
inner join [PM].[vwGenPatInfo] P on A.Patient_id = P.Patient_id 
where A.Appt_DateTime >= DATEADD(yyyy, -2, GETDATE()) and A.Appt_Cancelled_Date is NULL 
相關問題