2015-02-16 8 views
-3

У меня есть следующая таблица оракула с ниже 3 столбцами. Как вы можете видеть, у меня есть тот же номер контракта, что и номер другой карты и другой date_open. Мне нужно получить дату макс для каждого contract_numberполучить максимальную запись даты из группы записей

 
CONTRACT_NUMBER CARD_NUMBER   DATE_OPEN 

009-P-0000202  1236547896542145 11/23/2012 
009-P-0000202  5555666644441111 6/20/2014 
009-P-0000202  6655225544665878 6/25/2014 
009-P-008880  9666998775458789 5/16/2011 
009-P-008880  4561637899876435 1/22/2013 
009-P-0010873  6456879413185467 5/14/2013 
009-P-0200749  5000223365521456 2/28/2013 
009-P-098538  1000222266669870 12/19/2011 
009-P-098538  1000222266665555 3/22/2012 
009-P-098538  1000222266667777 7/27/2012 
009-P-098538  1000222266669995 2/27/2013 
009-P-098538  1000222266663333 3/22/2013 
009-P-098538  1000222266661222 4/18/2013 
009-P-098538  1000222266667567 7/26/2013 
009-P-098538  1000222266669876 1/10/2014 
009-P-098538  1000222266664456 6/13/2014 
009-P-098538  1000222266663345 8/19/2014 
009-P-098538  1000222266662321 12/5/2014 

желаемый результат должен выглядеть следующим образом:

 
CONTRACT_NUMBER CARD_NUMBER   DATE_OPEN 

009-P-0000202  6655225544665878 6/25/2014 
009-P-008880  4561637899876435 1/22/2013 
009-P-0010873  6456879413185467 5/14/2013 
009-P-0200749  5000223365521456 2/28/2013 
009-P-098538  1000222266662321 12/5/2014 

Цените ввод

+0

Возможный дубликат [Группа Oracle часть строки и строка с последней меткой времени] (http://stackoverflow.com/questions/27563797/oracle-group-part-of-row-and-get-row-with- last-timestamp) (см. второй ответ) –

+0

@Peter Lang: Он не указывает, какие значения номера карты ему нужно отобразить ... и мы не можем подразумевать «ожидаемые результаты». В определении проблемы говорится: «Мне нужно получить максимальную дату для каждого номера контракта»). – Veverke

+0

Если вам нужна строка, для которой 'DATE_OPEN' является максимальной в каждой группе' CONTRACT_NUMBER', тогда см. Мой ответ. –

ответ

0

Если я понял вашу проблему, выглядит, как вы после простой группы.

SELECT t.Contract_Number, 
     MAX(t.card_number) as MaxCardNumber, 
     MAX(t.Date_Open) as maxDate 
FROM yourTableName t 
GROUP BY t.Contract_Number 

Обратите внимание, что вы также получите номер карты. Вы также должны применить функцию агрегации к номеру карты, если хотите получить список, сгруппированный по номеру контракта.

+0

есть ошибка typo в MAX (t.card_number) как MaxCardNumber, MAX (t.Date_Open) как maxDate' – Exhausted

+0

что это такое? поля таблицы: conctract_number, card_number и date_open – Veverke

+1

запятая отсутствует в вашем ответе после 'MaxCardNumber' – Exhausted

0

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

WITH DATA AS(
SELECT t.*, 
       ROW_NUMBER() OVER (PARTITION BY CONTRACT_NUMBER  
            ORDER BY DATE_OPEN DESC) AS rn 
     FROM my_table t 
) 
SELECT CONTRACT_NUMBER, CARD_NUMBER, DATE_OPEN 
FROM DATA 
WHERE rn = 1 
/

Замените mytable на ваше фактическое имя таблицы.

0
SELECT * 
FROM table_name 
WHERE date_open IN (SELECT MAX(date_open) 
        FROM table_name 
        GROUP BY 
          CONTRACT_NUMBER 
        ORDER BY 
          date_open DESC) 
ORDER BY 
     date_open DESC 
+0

Ваш подзаголовок неверен. Он выкинет «ORA-00979: не выражение GROUP BY». –

+0

работает в mysql правильно. –

+0

OP использует Oracle. –

0

Используйте подзапрос, чтобы найти дату MAX для каждого CONTRACT_NUMBER:

select * from table t1 
where DATE_OPEN = (select max(DATE_OPEN) from table t2 
        where t1.CONTRACT_NUMBER = t2.CONTRACT_NUMBER) 

Если максимальная дата имеет несколько строк CONTRACT_NUMBER, все они будут возвращены.

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