2015-01-15 3 views
-3

내 CustomerID에만 distinct를 적용하고 내 table1에 RecordUpdate_date 열이있는 최신 레코드를 가져 오려고합니다.두 테이블의 고유 한 열 MS SQL Server 2008

이 쿼리를 작성했지만 일부 레코드 (레코드)가 누락되어 중복 레코드가 발생합니다.

도와주세요. 감사

표 :

CustomerID, CustomerName, UpdateDate 

표 2 :

CustomerID, DateofBirth 

내 쿼리 :

SELECT a.CustomerID 
     ,a.CustomerName 
     ,a.RecordUpDate_date 
     ,b.DateofBirth 
    FROM Table1 AS a 
    INNER JOIN (
       SELECT CustomerID 
         ,MAX(RecordUpdate_date) AS max_RecordUpdate_date 
        FROM Table1 
        GROUP BY CustomerID 
       ) AS abc 
     ON abc.CustomerID = a.CustomerID 
      AND abc.max_RecordUpdate_date = a.RecordUpdate_date 
    INNER JOIN Table2 AS b 
     ON b.CustomerID = a.CustomerID 
    INNER JOIN (
       SELECT CustomerID 
         ,MAX(DateofBirth) AS max_dob 
        FROM table2 
        GROUP BY CustomerID 
       ) AS m 
     ON m.CustomerID = a.Customer 
      AND m.max_cus = c.DateofBirth 
+0

형식 신의 사랑을위한 코드 – DLeh

+0

무엇을 하시겠습니까? 설명 및 몇 가지 샘플 레코드를 제공하십시오. 어쨌든, 테이블이 정상적으로 보이지 않습니다! – Alisa

+0

두 표의 모든 고객 ID의 고유 한 목록을 원하십니까? 각 테이블에서 DISTINCT CustomerID를 수행하고 두 테이블을 결합 할 수 있습니다. – Xedni

답변

0

이 시도 :

;WITH CTE 
     AS (SELECT CustomerID , 
        MAX(UpdateDate) max_RecordUpdate_date 
      FROM  dbo.Table1 
      GROUP BY CustomerID 
     ), 
    CTE1 
     AS (SELECT CustomerID , 
        MAX(DateofBirth) max_dob 
      FROM  dbo.Table2 
      GROUP BY CustomerID 
     ) 
SELECT CTE.CustomerID , 
     CustomerName , 
     max_RecordUpdate_date , 
     max_dob , 
     FLOOR((CAST (max_RecordUpdate_date AS INTEGER) 
       - CAST(max_dob AS INTEGER))/365.25) [Age] 
FROM CTE 
     INNER JOIN Table1 ON Table1.CustomerID = CTE.CustomerID 
          AND Table1.UpdateDate = CTE.max_RecordUpdate_date 
     LEFT JOIN CTE1 ON CTE1.CustomerID = CTE.CustomerID 
+0

select 명령문에 계산이 있기 때문에 사용할 수 없습니다. a.CustomerID, a.CustomerName, a.RecordUpDate_date, b.DateofBirth, FLOOR ((CAST (a.RecordUpdate_date AS INTEGER) - CAST (c.DATEOFBIRTH AS INTEGER))/365.25) AS Age ...를 추가 할 수 있습니까? 솔루션으로 계산 하시겠습니까? – SQL

+0

@SQL 왜 질문에 그 정보가 없습니까? 당신이 다른 사람에게 말하기를 귀찮게하지 않은 해결책에 중요한 다른 것이 있습니까? –

+0

그게 유일한 것입니다. 질문에 언급하지 않은 것에 대해 유감스럽게 생각합니다. 방금 그 요청을 받았어. – SQL

0
SELECT a.CustomerId, a.CustomerName, a.UpdateDate, b.DateofBirth 
FROM Table1 a 
INNER JOIN (SELECT CustomerId, MAX(UpdateDate) as UDate 
      FROM Table1 
      GROUP BY CustomerId 
      ) maxdate ON a.CustomerId = maxdate.CustomerId 
         AND a.UpdateDate = maxdate.UDate 
INNER JOIN Table2 b ON a.CustomerId = b.CustomerId 

고객 ID에 대한 레코드가 여러 개 있고 업데이트 된 경우 SELECT DISTINCT를 사용하십시오.

+0

이 오류 받기 : '내부'근처에 조건이 예상되는 컨텍스트에 지정된 부울 유형이 아닌 표현식입니다. – SQL

1

최신 레코드 만 가져 오는 방법은 여러 가지가 있습니다. 항상 사용하는 나의 개인은 ROW_NUMBER()http://msdn.microsoft.com/en-us/library/ms186734.aspx을 사용하는 것입니다.

먼저 CTE에서 customerid 및 desc date 필드를 기준으로 행의 번호를 매 깁니다. 다음은 rn =1이 각 고객에 대한 최신 레코드 만 가져 오는 위치를 선택합니다.

;WITH CTE 
      AS (
       SELECT customerID 
        ,customerName 
        ,UpdateDate 
        ,ROW_NUMBER() OVER (PARTITION BY customerID ORDER BY UpdateDate DESC) AS rn 
       FROM table1 AS a 
      ) 
    SELECT a.customerID 
      ,a.CustomerName 
      ,a.UpdateDate 
      ,b.DateOfBrith 
     FROM CTE a 
     JOIN table2 AS b 
      ON a.customerId = b.CustomerID 
     where a.rn = 1