查询返回不正确的结果
问题描述:
我的输入表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
答
试试这个。
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
答
这是不是一个真正的答案,对不起。
你的子查询找到最经常出现在病人身边的医生。 (如果您想要最常发生的患者/医生对,请从ROW_NUMBER
中删除分区子句。)
但是,然后您再次加入vwGenPatApptInfo(作为A)。为什么?而且,您的连接甚至不完整,因为您只能通过Patient_ID加入,而不能通过Appt_resource_id加入。因此,您可以在每个日期范围内将每位最常出现的医生与患者的其他医生记录相结合。这些你再次用DISTINCT
解雇。
我不明白你的查询如何得到错误的医生。如果您选择了A.Appt_resource_id
,那将是一个原因,但b.Appt_resource_id
应该是最常发生的医生。
我希望我的评论能够帮助你。也许你可以以某种方式简化你的查询,也许甚至可以摆脱这个错误。
祝你好运!
答
它可能不是最完美的解决方案,但尝试这个办法:
;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