2015-06-20 4 views
-3

У меня есть запрос, который устранит дубликаты и отобразит только уникальные записи.Удалите повторяющиеся строки после объединения нескольких таблиц

SELECT DISTINCT TBLPATIENT.MRN 
FROM tblpatient 

Выход:

MRN  
------ 
15257  
15283 
15285  
15290  
15291  
15302 

Однако, у меня есть дополнительные столбцы, которые мне нужны, чтобы показать, но я хочу только уникальные MRN с.

SELECT 
     v.PatientID, 
     p.firstname, 
     p.lastname, 
     p.dob, 
     p.mrn, 
     s.VisitID, 
     v.AdmitedDate 
FROM 
    tblPatient p 
JOIN 
    tblPatientVisit v ON p.id = v.PatientID 
JOIN 
    tblPatientSmokingScreenOrder s ON v.id = s.VisitID 
JOIN 
    DESCRIPTOR t ON s.SMOKING_STATUS_DSC_ID = DESCRIPTOR_ID 
WHERE 
     isdate(p.DOB) = 1 
     AND CONVERT(date,p.DOB) <'12/10/2000' 
     AND v.PatientType = 'I' and 
     isdate(v.AdmitedDate) = 1 
     AND CONVERT(date,v.AdmitedDate) > '06/16/2013 16:16' 

Выход:

PatientID firstname lastname dob   mrn  VisitID AdmitedDate 
--------------------------------------------------------------------------- 
1   JAMES  TEST  6/11/1942 100241 1  54:00.0 
10   TEST3  DEMOGRAPHIC 4/7/1980 100251 13  39:00.0 
5   TEST2  DEMOGRAPHIC 8/31/1938 3  12  36:00.0 
21   ZACHARY  EFRON  11/2/1976 100267 24  11:00.0 
16   PATIENT  DEMO  2/28/1943 100260 26  56:00.0 
17   ALICE  WONDERLAND 9/20/1942 100261 20  14:00.0 
23   TEST5  BROWN  5/6/1965 15285 27  40:00.0 
23   Test5  BROWN  5/6/1965 15285 27  40:00.0 

Как взять сценарий выше и реорганизовать его, чтобы показывать только Test5 Brown один раз?

+0

Можете ли вы предоставить все строки из каждой таблицы, относящиеся к пациенту № 23, и посетить 27? Какая таблица состоит из двух строк? Можно было бы подумать, что «tblpatient» имеет только один ряд на пациента. 'tblpatientvisit', вероятно, имеет 2+ строки для пациентов с 2+ посещениями (однако неясно, имеет ли он 2+ строки для одного посещения, из-за других описательных столбцов, может быть вашей проблемой), и неясно также, может ли быть отношения 1: M между 'tblpatientvisit' и' tblpatientsmokingscreenorder'. Использование 'distinct' просто было бы попыткой перевязать запрос. Нам нужно знать, где 1: M rel. is –

+0

Не заметил, что имена указаны по-разному для пациента № 23. Возможно, «tblpatient» имеет эффективные датированные строки, отражающие изменения имени пациента и другой информации с течением времени. Какие поля находятся на этом столе? Возможно, вам нужен коррелированный подзапрос, чтобы показать максимальную эффективную датированную запись с момента посещения. –

+0

Возможный дубликат [Как запросить таблицу SQL и удалить повторяющиеся строки из набора результатов] (http://stackoverflow.com/questions/16327383/how-to-query-sql-table-and-remove-duplicate-rows- from-a-result-set) –

ответ

-1

Возможно, вам просто нужно использовать определенное ключевое слово.

SELECT DISTINCT 
    v.PatientID, 
    p.firstname, 
    p.lastname, 
    p.dob, 
    p.mrn, 
    s.VisitID, 
    v.AdmitedDate 

FROM 
    tblPatient p 
    JOIN tblPatientVisit v ON p.id = v.PatientID 
    JOIN tblPatientSmokingScreenOrder s ON v.id = s.VisitID 
    JOIN DESCRIPTOR t ON s.SMOKING_STATUS_DSC_ID = DESCRIPTOR_ID 

WHERE 
    isdate(p.DOB) = 1 
    AND CONVERT(date,p.DOB) <'12/10/2000' 
    AND v.PatientType = 'I' and 
    isdate(v.AdmitedDate) = 1 
    AND CONVERT(date,v.AdmitedDate) > '06/16/2013 16:16'  
-- order by MRN 

Это вернет все уникальные строки.

+0

Спасибо, что было. – user3093389

+0

И все же он сбился проголосовавшим от кого-то ... :) –

+0

Возможно, они думали, что сортировка чувствительна к регистру, и в этом случае это не сработает. BTW, имеющие группу и разные, кажутся излишними. Вероятно, это не повлияет ни на что, но каждый из них должен отлично работать без другого. – Stephan

0

Если вы не имеете уникальную ценности, вам может понадобиться ROW_NUMBER, чтобы помочь найти первую запись каждого уникального ключа:

SELECT * FROM (
    SELECT 
    v.PatientID, 
    p.firstname, 
    p.lastname, 
    p.dob, 
    p.mrn, 
    s.VisitID, 
    v.AdmitedDate, 
    ROW_NUMBER() OVER (PARTITION BY p.mrn ORDER BY AdmitedDate DESC) AS row_nm 
    FROM 
    tblPatient p 
    JOIN tblPatientVisit v ON p.id = v.PatientID 
    JOIN tblPatientSmokingScreenOrder s ON v.id = s.VisitID 
    JOIN DESCRIPTOR t ON s.SMOKING_STATUS_DSC_ID = DESCRIPTOR_ID 
    WHERE 
    isdate(p.DOB) = 1 
    AND CONVERT(date,p.DOB) <'12/10/2000' 
    AND v.PatientType = 'I' and 
    isdate(v.AdmitedDate) = 1 
    AND CONVERT(date,v.AdmitedDate) > '06/16/2013 16:16' 
) res 
WHERE row_nm = 1 

Здесь нужен контролировать, который пациент, чтобы показать с MRN по используя разные столбцы ORDER BY в функции ROW_NUMBER().

Если у вас есть уникальное значение (уникальное для МРНА, например admiteddate), вы можете использовать группу, чтобы найти мин/макс (значение) для каждого MRN и сделать присоединиться, чтобы получить другие значения, как:

SELECT * from Table JOIN 
    (Select mrn, MAX(admitedDate) max_date from Table) u 
ON Table.mrn = u.mrn AND Table.AdmitedDate = u.max_date