2015-01-10 3 views
0

Как вы бы взяли строки в те же Bar с наибольшим Amount. У меня есть данные этого образца.Как сгруппировать, получив максимальную сумму при сохранении значений строк

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 

Результат должен храниться значения в строке.

Любая помощь будет оценена по достоинству. Thanks

ответ

0

Вы применяете MAx к строке, чтобы получить последнюю. Вы должны использовать MIN, если вы хотите получить A.

Edit:

Основываясь на ваш комментарий, следующий будет работать;

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

Спасибо, но результаты должны получить строки в том же 'Bar' с наибольшей суммой, сохраняя значения строк –

+0

, можете ли вы сделать это ясно. Каким будет ваш ожидаемый результат? – mindbdev

0

Если какой-либо один из строк в 'BAR', которые имеют максимальную 'Сумма' отлично, надеюсь, что ниже запрос помогает ..

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 
); 

Edit:

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..need, чтобы получить альтернативу rownum на сервере Sql. – Vignesh

+0

Отредактированный запрос с помощью верхнего предложения, пожалуйста, попробуйте .. – Vignesh

0

Сначала рассчитать максимальный Amount за Bar:

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

Для примера выше запрос будет возвращать этот результирующий набор:

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 

Теперь использовать ORDER BY MaxAmount DESC, Bar ASC (или ... Bar DESC) и применить TOP (1) WITH TIES к результату, чтобы вернуть подмножество, представляющее только один Bar:

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

Первый критерий сортировки вызывает запрос для возврата Bar или Bars, которые имеют наибольшее значение Amount. Второй необходим, чтобы убедиться, что возвращается только один 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 
    ... 
; 
Смежные вопросы