2013-10-03 64 views
0

我是SQL新手,所以請原諒任何表示法。我的問題的簡化版本如下。我在桌子招生住院和需要收集從表中的某個類型的最近門診要求索賠之前到入院日期:SQL連接:從原始表中選擇符合條件的最後一條記錄

SELECT a.ID , a.date, b.claim_date 
FROM admissions as a 
LEFT JOIN claims b on (a.ID=b.ID) and (a.date>b.claim_date) 
LEFT JOIN claims c on ((a.ID=c.ID) and (a.date>c.claim_date)) 
    and (b.claim_date<c.claim_date or b.claim_date=c.claim_date and b.ID<c.ID) 
WHERE c.ID is NULL 

的問題是,對於某些ID的我得到了許多記錄複製a.date,c.claim_date值。

我的問題是類似於一個在這裏

SQL join: selecting the last records in a one-to-many relationship

討論並在此

SQL Left join: selecting the last records in a one-to-many relationship

然而闡述,還有的只是在發生索賠尋找記錄添加皺紋之前和之後,我認爲這是造成這個問題。

更新

時間不存儲,有日期,而且由於病人能在同一天有多個記錄,這是一個問題。還有另一個皺紋,那就是我只想看看CLAIMS的一個子集(比如說claim.flag = TRUE)。這是我最後一次嘗試:

SELECT a.ID , a.date, b.claim_date 
FROM admissions as a 
LEFT JOIN (
     select d.ID , max(d.claim_date) cdate 
     from claims as d 
     where d.flag=TRUE 
     group by d.ID 
     ) as b on (a.ID=b.ID) and (b.claim_date < a.date) 
LEFT JOIN claims c on ((a.ID=c.ID) and (c.claim_date < a.claim_date)) 
    and c.flag=TRUE 
    and (b.claim_date<c.claim_date or b.claim_date=c.claim_date and b.ID<c.ID) 
WHERE c.ID is NULL 

然而,這跑了幾個小時之前中止(通常需要大約30分鐘與10 LIMIT)。

回答

1

您可能需要使用子查詢來解決這個問題嘗試:

SELECT a.ID, a.date, b.claim_date 
    FROM admissions as a 
    LEFT JOIN claims b ON (a.ID = b.ID) 
    WHERE b.claim_date = (
    SELECT MAX(c.claim_date) 
     FROM claims c 
     WHERE c.id = a.id -- Assuming that c.id is a foreign key to a.id 
     AND c.claim_date < a.date -- Claim date is less than admission date 
); 

嘗試用不同的ID來澄清,並使用一個額外的子查詢,以考慮重複日期:

SELECT a.ID, a.patient_id, a.date, b.claim_id, b.claim_date 
    FROM admissions as a 
    LEFT JOIN claims b ON (a.patient_ID = b.patient_ID) 
    WHERE b.claim_id = (
    SELECT MAX(c.claim_id) -- Max claim identifier (likely most recent if sequential) 
     FROM claims c 
     WHERE c.patient_ID = a.patient_ID 
        AND c.flag = TRUE 
        AND c.claim_date = (
         SELECT MAX(d.claim_date) 
          FROM claims d 
          WHERE d.patient_id = c.patient_id 
           AND c.claim_date < a.date -- Claim date is less than admission date 
           AND d.flag = TRUE 
        ) 
) 
     b.flag = TRUE; 
+0

這看起來很有希望,但我得到一個錯誤,a.ID不存在。我想因爲c.id不是外鍵? – Jeph

+0

此外,通常在同一天有多個聲明,我認爲這會導致重複。我只是最後一次約會。 – Jeph

+0

如果沒有數據庫表及其關係的準確描述,那麼使用適當的連接/關係編寫查詢將會很困難。你有沒有可能提供更多關於招生/索賠表的細節? – MeyerRJ

相關問題