MY输入表是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 :(得分:0)
对不起,这不是一个真正的答案。
您的子查询找到最常为患者出现的医生。 (如果您想要最常出现的患者/医生对,请从ROW_NUMBER
中删除分区条款。)
但是你再次加入vwGenPatApptInfo(作为A)。为什么?您的加入甚至是不完整的,因为您只能通过Patient_ID而不是Appt_resource_id加入。因此,您将在特定日期范围内将每位最常见的医生与患者的其他医生记录相结合。这些你再次使用DISTINCT
解雇。
然而,我没有看到您的查询如何得到错误的医生。如果您选择了A.Appt_resource_id
,那就是原因,但b.Appt_resource_id
应该是最常出现的医生。
我希望上面的评论可以帮到你。也许你可以以某种方式简化你的查询,也许甚至可以摆脱错误。
祝你好运!答案 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
答案 2 :(得分: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