SQL - все пациенты, у которых были только стоматологические визиты в 2010 году - PullRequest
2 голосов
/ 20 декабря 2010

У меня есть запрос T-SQL, который дает мне последнее посещение офиса в 2010 году, которое не было посещением стоматолога. Соответствующая часть запроса:

AND pv.PatientVisitId IN (                
    SELECT Max(pv1.PatientVisitID)            
        FROM PatientVisit pv1        
            JOIN DoctorFacility df1 ON pv1.FacilityID = df1.DoctorFacilityID
            JOIN PatientVisitResource pvr1 ON pv1.PatientVisitId = pvr1.PatientVisitId
                JOIN DoctorFacility dfr ON pvr1.ResourceId = dfr.DoctorFacilityId
        WHERE pv1.PatientProfileID = pp.PatientProfileID        
            AND pv1.Visit < '2011-01-01'    
            AND df1.ListName NOT LIKE '%Dental%'    
    )  

Теперь я хочу перевернуть это, чтобы получить последнее посещение офиса для пациентов, у которых только были стоматологические консультации. Я продолжаю бить стену здесь, хотя. Может ли кто-нибудь перебросить меня на другую сторону? : -)

Ответы [ 4 ]

2 голосов
/ 20 декабря 2010

Ключ должен использовать там, где его нет

AND pv.PatientVisitId IN (                
    SELECT Max(pv1.PatientVisitID)            
        FROM PatientVisit pv1        
            JOIN DoctorFacility df1 ON pv1.FacilityID = df1.DoctorFacilityID
            JOIN PatientVisitResource pvr1 ON pv1.PatientVisitId = pvr1.PatientVisitId
                JOIN DoctorFacility dfr ON pvr1.ResourceId = dfr.DoctorFacilityId
        WHERE pv1.PatientProfileID = pp.PatientProfileID        
            AND pv1.Visit < '2011-01-01'    
            AND df1.ListName LIKE '%Dental%'    
    ) 
and not exists ( Select 1 from   PatientVisit pv1        
            JOIN DoctorFacility df1 ON pv1.FacilityID = df1.DoctorFacilityID
            JOIN PatientVisitResource pvr1 ON pv1.PatientVisitId = pvr1.PatientVisitId
                JOIN DoctorFacility dfr ON pvr1.ResourceId = dfr.DoctorFacilityId
        WHERE pv1.PatientProfileID = pp.PatientProfileID        
            AND pv1.Visit < '2011-01-01'    
            AND df1.ListName NOT LIKE '%Dental%'    
    )
2 голосов
/ 20 декабря 2010

, вероятно, многие должны были это сделать, но первый способ, который приходит мне в голову, - это сравнить количество (1) посещения пациента с числом (1) посещения пациента, где df1.listname, например, «% Dental%», если эторавны, значит, они были только у дантиста.

1 голос
/ 20 декабря 2010

Если вы используете SQL Server 2005 или более позднюю версию, вы можете использовать EXCEPT, чтобы исключить группу записей из другого запроса.

Поэтому, в основном, напишите свой больший запрос (покажите ВСЕМ пациентам, у которых былпосетите этот год!), затем ...

...
EXCEPT
SELECT pv1.PatientVisitID        
        FROM PatientVisit pv1        
            JOIN DoctorFacility df1 ON pv1.FacilityID = df1.DoctorFacilityID
            JOIN PatientVisitResource pvr1 ON pv1.PatientVisitId = pvr1.PatientVisitId
                JOIN DoctorFacility dfr ON pvr1.ResourceId = dfr.DoctorFacilityId
        WHERE pv1.PatientProfileID = pp.PatientProfileID        
            AND pv1.Visit < '2011-01-01'    
            AND df1.ListName NOT LIKE '%Dental%'

Следует иметь в виду, что в обоих запросах необходимо иметь одинаковые столбцы (могут быть НЕКОТОРЫЕ различия,но для наших целей убедитесь, что и первый SELECT, и запрос EXCEPT возвращают одинаковые поля).

0 голосов
/ 20 декабря 2010
AND pv.PatientVisitId IN (              
  SELECT MAX(pv1.PatientVisitID) 
  FROM PatientVisit pv1                
    JOIN DoctorFacility df1 ON pv1.FacilityID = df1.DoctorFacilityID        
    JOIN PatientVisitResource pvr1 ON pv1.PatientVisitId = pvr1.PatientVisitId        
    JOIN DoctorFacility dfr ON pvr1.ResourceId = dfr.DoctorFacilityId       
  WHERE pv1.PatientProfileID = pp.PatientProfileID                
    AND pv1.Visit < '2011-01-01'            
  HAVING SUM(CASE WHEN df1.ListName LIKE '%Dental%' THEN 1 ELSE 0 END) = COUNT(*)
) 
...