2012-03-06 2 views
1

I가 다음 쿼리T-SQL 최대 값을 얻을

내가 최대 enterdate가 해당 CostID과 함께했다하지만 난 MAX (B.CostID)을 사용하지 않으려는 무엇인지 찾아야
SELECT P.ID, MAX(ENTERDATE) as ENTERDATE, MAX(B.CostID) as CostID 
    FROM Protocol P JOIN BANK B ON P.ID= B.ID         
    group by P.ID 

하지만, 나는 P.ID에 의해 그룹을 갖고 모든 다른 필드가 어떤 종류의 집계를 가질 필요가 있기 때문에 을 그렇게하도록 강요 당한다. P.ID로 그룹을 말하고 최대 (enterdate)를 표시하지만 해당 Enterdate에 해당하는 CostID를 어떻게 주시겠습니까?

+0

는 u는 일부 샘플 데이터를 게시 할 수 있습니다 두 테이블 및 UR 원하는 O/P에 대한? – Teja

+1

프로토콜 표 또는 은행 표의 Enterdate입니까? – Taryn

답변

3
SELECT P.ID, 
     ENTERDATE = MAX(p.ENTERDATE), 
     CostID  = (SELECT CostID FROM Bank WHERE ID = p.ID) 
    FROM Protocol P     
    group by P.ID 

또는

SELECT t.*, 
     CostID 
    FROM Bank b 
     JOIN (
       SELECT P.ID, 
         ENTERDATE = MAX(p.ENTERDATE) 
        FROM Protocol P     
        group by P.ID     
      ) t ON t.ID = b.ID 
+0

'ENTERDATE = MAX (p.ENTERDATE)'는 무엇을합니까? mimer sql validator가 T031, "BOOLEAN 데이터 유형"경고를주었습니다 - MAX (p.ENTERDATE) AS ENTERDATE와 동일합니까? – Aprillion

+0

예, 앨리어싱 열의 방식입니다. 'MAX (p.ENTERDATE) AS ENTERDATE'로 대체 할 수 있습니다. – Akhil

1

같은 이유를 하위 쿼리하지 :

SELECT MaxTable.*, BANK.CostID AS CostID 
FROM 
(
    SELECT P.ID, MAX(ENTERDATE) AS ENTERDATE 
    FROM Protocol P         
    GROUP BY P.ID 
) AS MaxTable 
JOIN BANK 
    ON MaxTable.ID = BANK.ID 
당신은 분석 함수 ROW_NUMBER으로 시도 할 수 있습니다
+0

내부 쿼리 (MaxTable)에서'Protocol'을'Bank'에 연결해야하는 이유는 무엇입니까? – Akhil

+0

죄송합니다. 너무 많이 복사하여 붙여 넣으십시오. :) 결정된 –

0

:

SELECT * 
FROM 
    (SELECT p.id, p.enterdate, b.costid, 
     ROW_NUMBER() OVER(PARTITION BY p.id ORDER BY p.enterdate DESC) AS rownum 
    FROM Protocol P JOIN BANK B ON P.ID= B.ID) 
WHERE rownum = 1 
관련 문제