2013-05-14 3 views
1

мне нужна помощь с этим запросом, мне нужно получить имя код адрес с самой последней датой в коде (date1 является < date6 в этом примере)SQL Oracle - максимальная функция

Tab1

code address 
==================== 
    cod1 addr1 
    cod2 addr2 
    cod3 addr3 
    cod4 addr4 

Таб2

code date  name 
=========================== 
    cod1 date1 name1 
    cod1 date2 name1 
    cod1 date3 name2 
    cod2 date3 name3 
    cod3 date5 name4 
    cod3 date6 name5 
    cod4 date3 name6 

Так я пишу

SELECT Tab1.code, Tab1.address, Tab2.name, max(Tab2.date) 
FROM Tab1, Tab2 
WHERE Tab1.code=Tab2.code 
GROUP BY 
Tab1.code, Tab1.address, Tab2.name 
ORDER BY 
Tab2.name 

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

+0

Пожалуйста, добавьте также ожидаемый результат. – TechDo

+0

ожидается выход: COD1 addr1 name2 date3 cod2 addr2 name3 date3 cod3 addr3 name5 date6 cod4 addr4 name6 date3 –

ответ

1

Вы можете использовать аналитику или агрегатные функции.

Analytics:

SELECT code, address, name, date 
    FROM (SELECT Tab1.code, Tab1.address, Tab2.name, Tab2.date, 
       row_number() OVER (PARTITION by tab1.code 
            ORDER BY tab2.date DESC) rn 
      FROM Tab1 
      JOIN Tab2 ON tab1.code = tab2.code) 
WHERE rn = 1 

Aggregates:

SELECT Tab1.code, Tab1.address, 
     MAX(Tab2.name) KEEP (DENSE_RANK FIRST ORDER BY tab2.date DESC) name, 
     MAX(tab2.date) KEEP (DENSE_RANK FIRST ORDER BY tab2.date DESC) date 
    FROM Tab1 
    JOIN Tab2 ON tab1.code = tab2.code 
GROUP BY Tab1.code, Tab1.address 

Это будет выбрать одну строку для каждой строки в таблице 1. Если имеются две строки в таблице 2, с той же датой и того же кода , только одна строка будет выбрана произвольно.

+0

Фактически Analytics вы предложили кидает выражение ошибки недостающей агрегатов [Err] ORA-00923: FROM ключевого слова не найдено, где Ожидаемый –

+0

Версия Oracle - 11.1.0.6.0 –

+0

@ Jarod81 В следующий раз не используйте зарезервированное слово 'DATE' как одно из ваших имен столбцов. Кроме того, если вы хотите, чтобы люди тестировали, вы можете указать инструкцию CREATE и INSERT. Вы можете использовать [SQLFiddle] (http://sqlfiddle.com/#!4/d41d8/11184), чтобы построить более полный полный пример. Наконец, вы должны ожидать внести некоторые корректировки, я предположил, что вы заменили бы фиктивное имя на имя столбца реального мира в примере =). –

Смежные вопросы