2016-06-07 162 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