2017-01-17 5 views
2

У меня есть таблица базы данных, как этотПолучить максимальную запись для каждого уникального значения столбца в таблице

A   ||  B  ||   C 
------------------------------------------ 
1     ABC    10 
1     XYZ    5 
2     EFG    100 
2     LMN    150 
2     WER    50 
3     ABC    50 
3     XYZ    75 

Теперь я хочу, чтобы иметь результирующий набор, как это, где я хочу, чтобы иметь максимальное значение column C для каждого значения в column A

A   ||  B  ||   C 
----------------------------------------- 
1     ABC    10 
2     LMN    150 
3     XYZ    75 

Я попытался с помощью distinct и max(), но это не сработало. как этот

выберите отчетливый # table.A, # table.B, MAX (# table.C) из #table группы по # table.A, # table.B

Есть простой способ для достижения это?

+0

Используйте 'ROW_NUMBER() OVER (PARTITION BY B ORDER BY C DESC)' в подзапрос, а затем выбрать только те, где номер строки равен 1. – ZLK

ответ

1

Использование MAX() в качестве оконной функции:

SELECT t.A, t.B, t.C 
FROM 
(
    SELECT A, B, C, MAX(C) OVER (PARTITION BY A) max_C 
    FROM yourTable 
) t 
WHERE t.C = t.max_C 

Если вы хотите получить только одну максимальную запись для каждой группы A значения, то вы должны использовать метод, предложенный @GurV, который является номером строки:

SELECT t.A, t.B, t.C 
FROM 
(
    SELECT A, B, C, ROW_NUMBER() OVER (PARTITION BY A ORDER BY C, B DESC) row_num 
    FROM yourTable 
) t 
WHERE t.row_num = 1 

Примечание тщательно ORDER BY C, B внутри вызова ROW_NUMBER(). Это поместит максимум C записей в верхней части каждого раздела, а затем также порядок по убыванию B значений. Тем не менее, останется только одно значение.

+0

Спасибо большое, что на самом деле работает для меня, но что, если в столбце C есть две записи с одинаковым значением, то есть 1 ABC 50 и 1 XYZ 50. Я хочу иметь только один из них. –

+0

@ Shekar.gvr Проверьте ответ, указанный Гурвиндером. Вы можете использовать 'ROW_NUMBER' в этом случае с' ORDER BY', который может различать две записи с одинаковым максимальным значением в столбце 'C'. –

0

Вы можете использовать функцию окна, чтобы сделать это:

select * from (select 
    t.*, 
    row_number() over (partition by A order by C desc) rn 
from your_table t) t where rn = 1; 

Если те, которые не поддерживаются, используйте JOIN:

select t1.* 
from your_table t1 
inner join (
    select A, max(C) C 
    from your_table 
    group by A 
) t2 on t1.A = t2.A 
and t1.C = t2.C; 
0

Просто еще один способ с простым Join и Group BY

Схема:

SELECT * INTO #TAB1 FROM (
SELECT 1 A, 'ABC' B , 10 C 
UNION ALL 
SELECT 1 , 'XYZ' , 5 
UNION ALL 
SELECT 2 , 'EFG' , 100 
UNION ALL 
SELECT 2 , 'LMN' , 150 
UNION ALL 
SELECT 2 , 'WER' , 50 
UNION ALL 
SELECT 3 , 'ABC' , 50 
UNION ALL 
SELECT 3 , 'XYZ' , 75 
)A 

ли присоединиться к югу от запроса

SELECT C2.A,C1.B, C2.MC 
FROM #TAB1 C1 
INNER JOIN 
(
SELECT A, MAX(C) MC 
FROM #TAB1 
GROUP BY A 
)AS C2 ON C1.A=C2.A AND C1.C= C2.MC 

И результат будет

+---+-----+-----+ 
| A | B | MC | 
+---+-----+-----+ 
| 1 | ABC | 10 | 
| 2 | LMN | 150 | 
| 3 | XYZ | 75 | 
+---+-----+-----+ 
1

Если вы заказываете как C, так и B, комбинация обоих может или не может дать вам самое высокое значение Column C. Поэтому я чувствую, что ниже запрос должен работать для вашего конкретного требования.

SELECT table.A, table.B, table.C 
    FROM 
    (
     SELECT A, B, C, ROW_NUMBER() OVER (PARTITION BY A ORDER BY C DESC) row_num 
     FROM yourTable 
    ) table 
    WHERE table.row_num = 1 
Смежные вопросы