2016-06-28 1 views
2

Я очень новичок в SQL, и у меня это напугано. Вы можете помочь мне с этим вопросом?SQL Query, чтобы выбрать каждую строку с максимальным значением для каждой группы

У меня есть следующие 2 таблицы:

ТАБЛИЦА 1: IssueTable

Id | RunId | Value 
--- 
1 | 1  | 10 
2 | 1  | 20 
3 | 1  | 30 
4 | 2  | 40 
5 | 2  | 50 
6 | 3  | 60 
7 | 4  | 70 
8 | 5  | 80 
9 | 6  | 90 

ТАБЛИЦА 2: RunTable

RunId  | EnvironmentId 
--- 
1   | 1 
2   | 3 
3   | 1 
4   | 2 
5   | 4 
6   | 2 

мне нужны строки IssueTable, которые представляют Макс RunID, сгруппированных по EnvironmentId в RunTable. В результате я должен был бы из таблиц:

ОЖИДАЕМЫЕ РЕЗУЛЬТАТЫ:

Id | RunId | Value | EnvironmentId 
--- 
4 | 2  | 40 | 3 
5 | 2  | 50 | 3 
6 | 3  | 60 | 1 
8 | 5  | 80 | 4 
9 | 6  | 90 | 2 

Так только строки с самой последней/самой высокой RunID из RunTable в EnvironmentId. Например, для EnvironmentId из «1» мне нужны строки, содержащие RunId из «3», потому что последний RunId on EnvironmentId «1» из RunTable равен «3». Аналогичным образом, самым последним прогоном для EnvironementId «2» был RunId «6»

+1

Что такое ваша РСУБД? Сервер Sql, postgres, oracle? –

ответ

2

Используйте подзапрос, чтобы получить максимальный runid для каждого environmentid из таблицы запуска. Присоедините полученный результат к эмулируемому и выберите нужные столбцы.

select i.id, i.runid, i.value, r.environmentid 
from (select environmentid, max(runid) maxrunid 
     from runtable 
     group by environmentid) r 
join issuetable i on i.runid = r.maxrunid 
order by i.runid, i.id 
1

В эти дни можно использовать аналитические функции, такие как RANK, DENSE_RANK, ROW_NUMBER, чтобы сгенерировать рейтинг ваших записей.

Функции окна являются частью стандарта ANSI SQL: 2003.
И я, по крайней мере, столкнулся с ними на TeraData, Oracle и SQL-Server.

select Id, RunId, Value, EnvironmentId 
from (
    select i.*, r.EnvironmentId, 
    dense_rank() over (partition by r.EnvironmentId order by r.RunId desc) as RN 
    from issuetable i 
    inner join runtable r on (i.RunId = r.RunId) 
) Q 
where RN = 1 
order by Id; 

Внутренний запрос даст следующие результаты:

Id RunId Value EnvironmentId RN 
1 1  10  1    2 
2 1  20  1    2 
3 1  30  1    2 
4 2  40  3    1 
5 2  50  3    1 
6 3  60  1    1 
7 4  70  2    2 
8 5  80  4    1 
9 6  90  2    1 
+1

Функции окна были введены в SQL: 2003, а не в 1999. и DB2, Postgres, Firebird и некоторые другие также поддерживают их. –

+0

Действительно, статья, которую я нашел, заставила меня ошибочно принять неправильный стандарт для этих функций. Спасибо, что указали это. Это было исправлено в ответ. – LukStorms