2016-06-07 3 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.

Я не вижу, как ваш запрос попадает не по назначению. Если бы вы выбрали , это было бы причиной, но 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 
Смежные вопросы