2012-02-27 6 views
0

У меня есть таблица, как этотПолучить максимальное значение столбца из набора строк

Table A: 

Id Count 
1 4 
1 16 
1 8 
2 10 
2 15 
3 18 
etc 

Table B: 
1 sample1.file 
2 sample2.file 
3 sample3.file 

TABLE C: 
Count fileNumber 
16 1234 
4 2345 
15 3456 
18 4567 

и так далее ...

То, что я хочу это

1 sample1.file 1234 
2 sample2.file 3456 
3 sample3.file 4567 

Для получить максимальное значение из таблицы AI используется

Select MAX (Count) from A where Id='1' 

Это работает, мы но моя проблема заключается в объединении данных с другой таблицей.

Когда я присоединяюсь к таблице B и таблице A, мне нужно получить MAX для всех идентификаторов, и по моему запросу я не знаю, что такое Id.

Это мой запрос

SELECT B.*,C.* 
JOIN A on A.Id = B.ID 
JOIN C on A.id = B.ID 
WHERE (SELECT MAX(COUNT) 
     FROM A 
     WHERE Id = <what goes here????>) 

Чтобы подвести итог, что я хочу, это значение из таблицы B, Номер_файл из таблицы с (где значением счетчик Max для ID из таблицы А).

ОБНОВЛЕНИЕ: таблица с надписью C выше. Похоже, мне нужно Таблица А.

+2

Что такое идентификатор в таблице C? В чем разница между подсчетом в таблице A и таблице C? –

+2

Из приведенных выше данных примера не видно, что таблица A даже необходима, поскольку значения дублируются в C. –

+0

@B Семь: Идентификатор в таблице c такой же, как Id в таблице A и таблице B. – user393148

ответ

2

Я думаю, что это вопрос, что вы ищете:

select b.*, c.filenumber from b 
join (
    select id, max(count) as count from a 
    group by id 
) as NewA on b.id = NewA.id 
join c on NewA.count = c.count 

Однако следует принять во внимание, что я не понимаю, почему для ид = 1 в таблице A вы выбираете 16 для соответствия таблице C (которая является максимальной), а для id = 2 в таблице A вы выбираете 10 для соответствия таблице C (которая является минимальной). Я предположил, что вы имели в виду макс в обоих случаях.

Edit:

Я вижу, что вы обновили данные TABLEA. Результаты запроса в этом, учитывая предыдущие данные:

+----+---------------+------------+ 
| ID | FILENAME | FILENUMBER | 
+----+---------------+------------+ 
| 1 | sample1.file |  1234 | 
| 2 | sample2.file |  3456 | 
| 3 | sample3.file |  4567 | 
+----+---------------+------------+ 

Вот working example

+1

Большое спасибо Мости. Это сработало. Я попытаюсь реализовать одно и то же решение для другой проблемы, с которой я столкнулся. Еще раз спасибо. – user393148

0
select 
     PreMax.ID, 
     B.FileName, 
     C2.FileNumber 
    from 
     (select C.id, max(C.count) maxPerID 
      from TableC C 
      group by C.ID 
      order by C.ID) PreMax 

     JOIN TableC C2 
      on PreMax.ID = C2.ID 
      AND PreMax.maxPerID = C2.Count 

     JOIN TableB B 
      on PreMax.ID = B.ID 
+0

Спасибо за ваш ответ. Таблица C не имеет идентификатора. Мне нужно получить это из таблицы A. Как мне изменить? – user393148

1

Используя рабочий пример Мостах (в переименовании количество ключевых слов, чтобы CNT для имени столбца), это другой подход:

with abc as (
    select 
    a.id, 
    a.cnt, 
    rank() over (
     partition by a.id 
     order by cnt desc 
    ) as rk, 
    b.filename 
    from a join b on a.id = b.id 
) 
    select 
    abc.id, abc.filename, c.filenumber 
    from abc join c 
    on c.cnt = abc.cnt 
    where rk = 1; 
Смежные вопросы