2011-04-20 3 views
4

누군가이 쿼리를 도와 줄 수 있습니까?여러 열을 하나씩 선택 하시겠습니까?

가 돌아
SELECT CLIENT.ID_CLIENT , 
      EVALUATION_CLIENT.ID_EVAL , 
      MAX(EVALUATION_CLIENT.Date) AS DATE 

FROM EVALUATION_CLIENT 

INNER JOIN CLIENT 
    ON CLIENT.ID_CLIENT = EVALUATION_CLIENT.FK_IDClient 

WHERE EVALUATION_CLIENT.Date 
      BETWEEN @START_DATE_LOCAL 
      AND @END_DATE_LOCAL 

GROUP BY CLIENT.IDCLIENT, 
      EVALUATION_CLIENT.ID_EVAL 

...

ID_CLIENT | ID_EVAL | DATE_EVAL 
1423  |11160  | 2008-02-12 00:00:00.000 
1423  |11161  | 2008-02-18 00:00:00.000 
18  |11162  | 2008-02-15 00:00:00.000 
666  |11163  | 2008-02-19 00:00:00.000 

하지만 난 2008

많이 감사 MSSQL을 사용 (중복 없음 클라이언트)

ID_CLIENT | ID_EVAL | DATE_EVAL 
1423  |11161  | 2008-02-18 00:00:00.000 
18  |11162  | 2008-02-15 00:00:00.000 
666  |11163  | 2008-02-19 00:00:00.000 

같은 것을 원한다!

업데이트 : 나는 Id_client

에 의해 가장 최근 날짜의 Id_Eval 필요
+0

각 클라이언트에 대해 가장 높은 ID_EVAL 만 원하십니까? 아니면 최신 날짜가있는 것을 원하니? 그것들은 정의에 의한 것입니까? –

답변

5

, 당신은 사용할 수 있습니다

;WITH ClientEvals AS 
(
    SELECT 
     c.ID_CLIENT , 
     e.ID_EVAL , 
     e.Date AS ClientDATE, 
     ROW_NUMBER() OVER(PARTITION BY c.ID_CLIENT ORDER BY e.Date DESC) AS 'RowNo' 
    FROM  
     dbo.EVALUATION_CLIENT e 
    INNER JOIN 
     dbo.CLIENT c ON c.ID_CLIENT = e.FK_IDClient 
    WHERE 
     e.Date BETWEEN @START_DATE_LOCAL AND @END_DATE_LOCAL 
) 
SELECT  
    ID_CLIENT , 
    ID_EVAL , 
    ClientDATE 
FROM 
    ClientEvals 
WHERE 
    RowNo = 1 

열팽창 계수 (공통 테이블 식) 내부의 내부 선택은 각 클라이언트에 대한 evals을 선택하고, 파티션 ID_Client에 의한 데이터 - 각 클라이언트는 1에서부터 최대 행 번호를 얻습니다.

바깥 쪽 SELECT은 해당 CTE를 기반으로 각 클라이언트에 대해 최신 값인 RowNo = 1 인 행만 선택합니다.

+1

ROW_NUMBER의 +1 사용 –

+0

바로 그게 내가하려는 것입니다! 감사 –

2

당신이 할 수있는 당신은 단지 ID_CLIENT 가장 높은 ID_EVAL를 원하는 경우, 다음

SELECT CLIENT.ID_CLIENT , 
      MAX(EVALUATION_CLIENT.ID_EVAL), 
      MAX(EVALUATION_CLIENT.Date) AS DATE 

FROM EVALUATION_CLIENT 

INNER JOIN CLIENT 
    ON CLIENT.ID_CLIENT = EVALUATION_CLIENT.FK_IDClient 

WHERE EVALUATION_CLIENT.Date 
      BETWEEN @START_DATE_LOCAL 
      AND @END_DATE_LOCAL 

GROUP BY CLIENT.IDCLIENT 
+0

한 행의'ID_EVAL'과 다른 행의'Date'를 반환 할 수 있습니다. 포스터가 요구 사항에 대해 분명하지 않기 때문에 괜찮을 수도 있지만, 같은 행에서 두 요소를 모두 갖고 싶어 할 가능성이 더 높습니다. 더 높은'ID_EVAL'이 나중에'Date'를 가질 것이라는 보장이된다면, 어떤 경우이든 괜찮을 것입니다. –

+0

@Dave - 충분합니다. 그것을 결정하기 위해 OP에서 더 많은 정보가 필요합니다. – Oded

0

이러한 접근 방식이됩니다 케이스 허용는 동일한 행에 없습니다. MAX(EVALUATION_CLIENT.Date)

해당 조건에 대해 걱정할 필요가없는 경우 se Oded의 접근법. 당신은 각 클라이언트에 대한 가장 최근의 항목을 원하는 경우

SELECT CLIENT.ID_CLIENT , 
     EVALUATION_CLIENT.ID_EVAL , 
     EVALUATION_CLIENT.Date 
FROM evaluation_client 
     INNER JOIN client 
     ON client.id_client = evaluation_client.fk_idclient 
     INNER JOIN (SELECT client.id_client, 
          MAX(evaluation_client.DATE) AS DATE 
        FROM evaluation_client 
          INNER JOIN client 
          ON client.id_client = evaluation_client.fk_idclient 
        WHERE evaluation_client.DATE BETWEEN 
          @START_DATE_LOCAL AND @END_DATE_LOCAL 
        GROUP BY client.id_client, 
          evaluation_client.id_eval)maxdate 
     ON evaluation_client.DATE = maxdate.DATE 
      AND client.id_client = maxdate.id_client 
관련 문제