2013-10-03 2 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

그러나

에 정교 발생 된 청구 범위에 기록 만보고의 추가 주름이있다 전에 a.date하고 나는 그 문제를 일으키는 것 같아요.

업데이트

타임즈 그냥 날짜, 그리고 환자가 같은 날에 여러 레코드를 가질 수 있기 때문에,이 문제입니다, 저장되지 않습니다. 또 다른 주름이 있습니다. 클레임의 하위 집합 만보고 싶다는 것입니다 (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 

그러나,이 (일반적으로 LIMIT 10로 약 30 분 소요) 중단하기 전에 몇 시간 달렸다.

답변

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

이를 유망 해 보이지만, 나는 ID가 존재하지 않는다는 오류를 얻었습니다 .C.id가 외래 키가 아니기 때문에 나는 생각합니다. – Jeph

+0

또한 동일한 날짜에 일반적으로 여러 개의 클레임이 있으며 중복으로 이어질 것이라고 생각합니다. 나는 마지막 날짜 뿐이야. – Jeph

+0

데이터베이스 테이블과 데이터베이스 테이블의 관계에 대한 정확한 설명이 없으면 적절한 조인/관계가있는 쿼리를 작성하기가 어려울 수 있습니다. 입학/소유권 주장 테이블에 대한 자세한 정보를 제공 할 수있는 기회가 있습니까? – MeyerRJ

관련 문제