2015-01-10 2 views
0

같은 행의 행을 어떻게 얻을 수 있습니까? AmountBar입니다. 이 샘플 데이터가 있습니다.행 값을 유지하면서 최대 값으로 그룹화하는 방법

Foo | Bar | Amount 
1 | A | 0 
43 | A | 120 
1 | B | 0 
43 | B | 120 
1 | C | 0 
43 | C | 105 

예상 된 결과

Foo | Bar | Amount 
1 | A | 0 
43 | A | 120 

또는

Foo | Bar | Amount 
1 | B | 0 
43 | B | 120 

위의 두의 모든 나는 오직 최고 Amount을 필요로하기 때문에 잘 할 것. 이 쿼리가 있지만 올바르게 보이지 않습니다.

select 
    Foo 
    ,max(Bar) as Bar 
    ,max(Amount) as Amount 
from Table1 
group by Foo 

나는

Foo | Bar | Amount 
1 | C | 0 
43 | C | 120 

얻고있다 결과는 행의 값을 유지해야한다.

도움을 주시면 감사하겠습니다. 감사합니다.

답변

0

문자열에 MAx를 적용하여 마지막 문자열을 얻습니다. 당신이 대답을 얻으려면 당신은 MIN을 사용한다

편집 :

귀하의 의견을 바탕으로

, 다음이 작동합니다;

WITH CTE as(
Select t1.Bar from #TBL1 t1 
where t1.Amount = (Select MAX(Amount) From #TBL1) 
group by t1.Bar) 
Select t1.* From CTE ct 
join #TBL1 t1 
on t1.Bar = ct.Bar 

#TBL을 테이블 이름으로 바꿉니다.

+0

예. 'min() '을 사용하면 문제가 해결되지만 찾고있는 결과가 중간에 있다면 어떻게 될까요? –

0

사용하는 다음

SELECT TOP 1 
Foo , 
Bar, 
Amount 
FROM Table1 
order by 
Amount desc 
,Bar asc 
+0

고마워요.하지만 행 값을 그대로 유지하면서 결과가 같은 '막대'에있는 행을 가져야합니다. –

+0

당신은 그렇게 명확하게 할 수 있습니까? 예상되는 결과는 무엇입니까? – mindbdev

0

최대 '금액'을 가지고 '바'행 중 하나가 좋은 경우, 은 .. 아래 쿼리가 도움이되기를 바랍니다

select * from table1 where bar in (
    select bar 
    from(
    select bar,max(amount) maxim 
    from table1 
    group by bar 
    order by maxim desc 
) where rownum =1 
); 

편집 :

select * from table1 where bar in (
     select bar 
     from(
Select top(1) bar,maxim from (
     select bar,max(amount) maxim 
     from table1 
     group by bar 
     order by maxim desc 
    )) 
    ); 
+0

'rownumber = 1'에 오류가 발생했습니다. 내가 뭘 놓치고 있니? –

+0

오 ..이 쿼리는 oracle에서 테스트되었습니다 .. SQL 서버에서 rownum의 대안을 얻으려고합니다. – Vignesh

+0

상단 절을 사용하여 쿼리를 수정했습니다. 시도해보십시오. – Vignesh

0

우선당 최대 Amount을 계산하십시오. 41,358,383,210 :

Foo Bar Amount MaxAmount 
--- --- ------ --------- 
1 A 0  120 
43 A 120  120 
1 B 0  120 
43 B 120  120 
1 C 0  105 
43 C 105  105 

지금 한 Bar를 나타내는 하위 집합을 반환하는 ORDER BY MaxAmount DESC, Bar ASC (또는 ... Bar DESC)를 사용하고 그 결과에 TOP (1) WITH TIES을 적용

SELECT 
    Foo, 
    Bar, 
    Amount, 
    MaxAmount = MAX(Amount) OVER (PARTITION BY Bar) 
FROM 
    dbo.Table1 
; 

귀하의 예를 들어이 결과 집합을 반환 위의 쿼리 :

SELECT TOP (1) WITH TIES 
    Foo, 
    Bar, 
    Amount, 
    MaxAmount = MAX(Amount) OVER (PARTITION BY Bar) 
FROM 
    dbo.Table1 
ORDER BY 
    MaxAmount DESC, 
    Bar ASC 
; 

첫 번째 정렬 기준은 쿼리가을 반환하도록합니다.또는 Amount 값을 가진 Bars입니다. 두 개 이상이 동일한 최대 값을 갖는 경우 하나만 Bar이 리턴되도록해야합니다.

반환되는 행의 순서는 보장되지 않습니다. 필요한 경우 두 번째 쿼리를 파생 테이블로 사용하고 필요에 따라 결과를 다시 정렬합니다.

SELECT 
    ... 
FROM 
    (
    SELECT TOP (1) WITH TIES 
     Foo, 
     Bar, 
     Amount, 
     MaxAmount = MAX(Amount) OVER (PARTITION BY Bar) 
    FROM 
     dbo.Table1 
    ORDER BY 
     MaxAmount DESC, 
     Bar ASC 
) AS s 
ORDER BY 
    ... 
; 
관련 문제