2015-06-20 29 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?哪個表有2行?人們會認爲'tblpatient'只有每個病人一行。 'tblpatientvisit'可能對2+ 2+患者有2+行(但是,由於其他描述性列,它是否具有2+行用於相同訪問可能是您的問題),並且還不清楚是否可能存在「tblpatientvisit」和「tblpatientsmokingscreenorder」之間的1:M關係。使用'distinct'只是試圖用bandaid查詢。我們需要知道1:M rel。是 –

+0

沒有注意到患者#23的姓名拼寫有所不同。也許'tblpatient'具有有效日期行,反映了隨着時間的推移患者姓名和其他信息的變化。該桌上有哪些字段?也許你需要一個相關的子查詢來顯示訪問時的最大有效日期記錄。 –

+0

[如何查詢SQL表並從結果集中刪除重複行]可能的重複(http://stackoverflow.com/questions/16327383/how-to-query-sql-table-and-remove-duplicate-rows- from-a-result-set) –

回答

-1

您可能只需要使用distinct關鍵字。

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

也許他們認爲排序規則是區分大小寫的,在這種情況下,這是行不通的。順便說一句,看起來多餘。它可能不會影響任何東西都有,但每個都應該工作得很好,沒有其他。 – 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通過展現出來哪個病人在ROW_NUMBER()函數中使用不同的ORDER BY列。

如果你有一個獨特的價值(唯一的MRN,如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