2013-09-29 6 views
1

나는 테이블 자체에 조인을 남기거나 사례 내역을 사용하여 뷰 내에서 최대 값을 할당 할 수 있는지 궁금합니다. 나는 모든 값을 나열하는 뷰를 생성 할뿐만 아니라 등, 현재 행이 최대 행인지 표시 다른 열이최대 값을 기반으로 조인

Lastname  Firstname  Filename 
Smith  John   001 
Smith  John   002 
Smith  Anna   003 
Smith  Anna   004 

:

Lastname  Firstname  Filename  Max_Filename 
Smith  John   001   NULL 
Smith  John   002   002 
Smith  Anna   003   NULL 
Smith  Anna   004   NULL 
나는 다음과 같은 테이블이 말

이것이 가능합니까? 다음 쿼리를 시도했습니다 :

SELECT Lastname, Firstname, Filename, CASE WHEN Filename = MAX(FileName) 
THEN Filename ELSE NULL END AS Max_Filename 

그러나 성은 그룹 by 절에 없습니다. 그러나 성, 성, 파일 이름을 그룹화하면 max_filename의 모든 내용이 파일 이름과 동일합니다.

내가 잘못하고있는 부분과이 쿼리를 작동시키는 방법을 이해할 수 있도록 도와 주시겠습니까?

답변

4

실제로 당신은 매우 가까이있어, 대신 max 간단 집계를 사용하면 윈도우 함수로 max를 사용할 수 있습니다

select 
    Lastname, Firstname, Filename, 
    case 
     when Filename = max(Filename) over(partition by Lastname, Firstname) then Filename 
     else null 
    end as Max_Filename 
from Table1 

sql fiddle demo

+1

두 번째로 더 우아한 솔루션으로 나를 때려 눕히십시오. 지난번에 끝나지 않을거야. 비록 질문이 있습니다. 귀하의 쿼리는 더 복잡한 실행 계획을 가지고 있으며 더 느리게 실행됩니다 (데이터에 의존 할 수는 있지만 인덱스 - 나는 많은 테스트를하지 않았습니다). 그게 기대 되니? – Szymon

+1

@Szymon 중 어느 쪽을 말할 수 있습니까? 모든 쿼리가 인덱스에 있지 않으면 두 쿼리 모두 테이블을 전체 스캔해야합니다. 쿼리는 firstname, lastname (인덱스가 있다고 가정)에 대한 두 번째 검사를 수행해야하므로 더 복잡한 실행 계획을 가지고 있어야하며 훨씬 느리게 실행해야합니다. – Ben

+1

글쎄, 실행 계획을 확인하지는 못했지만 실제로 쿼리에서 두 스캔 (또는 검색)이 내 쿼리보다 느려야합니다. 예제가있는 sqlfiddle가 있습니까? –

1

그것은 그런 일이 될 수 :

SELECT 
    T.Lastname, 
    T.FirstName, 
    T.Filename, 
    CASE (SELECT MAX(T1.Filename) FROM MyTable T1 
      WHERE T.Lastname = T1.Lastname AND T.FirstName = T1.FirstName) 
     WHEN T.Filename THEN T.Filename 
     ELSE NULL 
    END 
FROM MyTable T 

하지만 난 당신이 최대 파일 이름이 무슨 뜻인지 모르겠어요? 모든 레코드의 총 최대 값은? 또는 각 이름에 대해 별도로? 예상 결과가 일치하지 않습니다. 알려 주시면 검색어를 수정하겠습니다.

+0

나는 각 성/이름 조합에 대해 최대를 언급하고있었습니다. 답변 주셔서 감사합니다! – user1422348

0

이보십시오.

DECLARE @TAB2 TABLE(LASTNAME VARCHAR(40), FIRSTNAME VARCHAR(40), FILENAME VARCHAR(40)) 
INSERT INTO @TAB2 VALUES 
('Smith',  'John',   '001'), 
('Smith',  'John',   '002'), 
('Smith',  'Anna',   '003'), 
('Smith',  'Anna',   '004') 

SELECT 
    LASTNAME, 
    FIRSTNAME, 
    FILENAME, 
    CASE ROW_NO WHEN 2 THEN FILENAME ELSE NULL END AS MAX_FILENAME 
FROM 
(
    SELECT 
     LASTNAME, 
     FIRSTNAME, 
     FILENAME, 
     ROW_NO = ROW_NUMBER() OVER (PARTITION BY FIRSTNAME ORDER BY FILENAME ASC) 
    FROM @TAB2 
)A 
관련 문제