2010-07-16 4 views
4

내 SQL- 쿼리는 이전 레코드 (클레임)를 반환해야합니다. Previous는 다른 기본 키 (idData), 동일한 SSN_Number 및 이전 Received_Date를 가짐을 의미합니다. 문제는 Received_Date가 같을 수 있으므로 다른 열을 찾아야한다는 것입니다. 우선 순위는 정렬 순서와 동일해야합니다. 쿼리가 두 ID가 다른 레코드 (두 클레임이 서로에 대해 이전이므로)를 반환하기 때문에 내가 뭘 잘못 했습니까? SQL에 어떤 문제가 있습니까? ("이전"레코드 찾기)

내 두 테스트 - 레코드를

는 다음과 같습니다

SELECT TOP (1) Claim.idData  AS ClaimID, 
       PrevClaim.idData AS PrevClaimID 
FROM tabData AS Claim 
     INNER JOIN tabData AS PrevClaim 
     ON Claim.SSN_Number = PrevClaim.SSN_Number 
      AND Claim.idData <> PrevClaim.idData 
      AND (Claim.Received_Date > PrevClaim.Received_Date 
        OR Claim.Claim_Creation_Date > PrevClaim.Claim_Creation_Date 
        OR Claim.Repair_Completion_Date > 
         PrevClaim.Repair_Completion_Date 
        OR Claim.Claim_Submitted_Date > 
         PrevClaim.Claim_Submitted_Date) 
WHERE (Claim.idData = @claimID) 
ORDER BY PrevClaim.Received_Date DESC, 
      PrevClaim.Claim_Creation_Date DESC, 
      PrevClaim.Repair_Completion_Date DESC, 
      PrevClaim.Claim_Submitted_Date DESC 

편집 : same SSN_Number http://www.bilder-hochladen.net/files/4709-kr.jpg

는 SQL-쿼리가 이것이다

: Mongus 퐁에 따라이 올바른 SQL입니다 답변
SELECT TOP (1) Claim.idData AS ClaimID, PrevClaim.idData AS PrevClaimID 
FROM tabData AS Claim INNER JOIN tabData AS PrevClaim 
     ON Claim.SSN_Number = PrevClaim.SSN_Number 
     AND Claim.idData <> PrevClaim.idData 
     AND (Claim.Received_Date > PrevClaim.Received_Date 
     OR Claim.Received_Date = PrevClaim.Received_Date AND Claim.Claim_Creation_Date > PrevClaim.Claim_Creation_Date 
     OR Claim.Received_Date = PrevClaim.Received_Date AND Claim.Claim_Creation_Date = PrevClaim.Claim_Creation_Date AND Claim.Repair_Completion_Date > PrevClaim.Repair_Completion_Date 
     OR Claim.Received_Date = PrevClaim.Received_Date AND Claim.Claim_Creation_Date = PrevClaim.Claim_Creation_Date AND Claim.Repair_Completion_Date = PrevClaim.Repair_Completion_Date AND Claim.Claim_Submitted_Date > PrevClaim.Claim_Submitted_Date) 
WHERE (Claim.idData = @claimID) 
ORDER BY PrevClaim.Received_Date   DESC, 
     PrevClaim.Claim_Creation_Date DESC, 
     PrevClaim.Repair_Completion_Date DESC, 
     PrevClaim.Claim_Submitted_Date DESC 

답변

3

해당 날짜 중 하나가 다른 날짜보다 작 으면 이전 레코드를 반환하는 것이 문제입니다.

두 레코드의 날짜가 서로 다른 날짜보다 적어서 eachothers 레코드를 반환합니다. 그것은 끔찍한 보이는

Claim.Received_Date > PrevClaim.Received_Date OR 
(Claim.Received_Date = PrevClaim.Received_Date AND Claim.Claim_Creation_Date > PrevClaim.Claim_Creation_Date) OR 
(Claim.Received_Date = PrevClaim.Received_Date AND Claim.Claim_Creation_Date = PrevClaim.Claim_Creation_Date AND Claim.Repair_Completion_Date > PrevClaim.Repair_Completion_Date) OR 
(Claim.Received_Date = PrevClaim.Received_Date AND Claim.Claim_Creation_Date = PrevClaim.Claim_Creation_Date AND Claim.Repair_Completion_Date = PrevClaim.Repair_Completion_Date AND Claim.Claim_Submitted_Date > PrevClaim.Claim_Submitted_Date) 

,하지만 당신을 위해 SQL 이잖아 : 당신은 아마 뭔가를 필요로 지정 무엇에 따르면

!

+0

고맙습니다. 그게 효과가있다. 나는 그것이 그와 같을 것임에 틀림 없다고 생각했다. 그러나 나는 그것에 대해 혼란스러워했다. :) –

1

두 레코드를 모두 얻은 것 같습니다.

은 두 번째에 해당하며 OR 그룹에있는 다른 세 개의 절은 첫 번째 것에 대해 true입니다.

완료 날짜를 비교하지 않을 수도 있습니다. 아마도 Claim_Submitted_Date와 같은 다른 하나의 필드에 있습니까?

+0

1 분 미만의 구타 : P –

1

첫 번째 행은 두 번째 행보다 초인 REPAIR_COMPLETION_DATE입니다. 즉, JOIN 조건 Claim.Repair_Completion_Date > PrevClaim.Repair_Completion_Date을 만족하므로 "이전"소유권 주장으로 간주됩니다.

관련 문제