Отображение имени и максимального возраста

Возможный дубликат:
Как отобразить запись с наибольшим значением в Oracle?

Я должен отображать имя и возраст самого старого человека из базы данных. Код, который я использовал, отображает имя и рассчитанный возраст нескольких человек, но не отображает самого старшего из них. Как заставить это работать? вот мой код

select dr_drvname as "Name", trunc(max((sysdate-dr_brthdate)/365)) as "Highest AGE"
from driver,dual
group by dr_drvname;

person Johnny Nguyen    schedule 18.11.2012    source источник


Ответы (3)


Другой способ в Oracle будет выглядеть примерно так:

SELECT
    dr_drvname AS "Name",
    trunc(months_between(sysdate, dr_birthdate) / 12) AS "Highest Age"
FROM
(
SELECT
    dr_drvname,
    dr_birthdate
FROM
    driver
ORDER BY
    dr_birthdate
)
WHERE
    ROWNUM = 1;
person Brian Camire    schedule 18.11.2012

Попробуйте что-то вроде этого:

SELECT top 1
  Firstname, LastName, Max([BirthDate]) as Oldest    
  FROM [Employees]
  group by BirthDate, FirstName, LastName

Примечание. Каковы требования, если несколько человек имеют одинаковую дату рождения?

person Steve Wellens    schedule 18.11.2012
comment
Я мог бы использовать WHERE trunc((sysdate-dr_brthdate)/365) ›97, потому что я знаю, что самый высокий возраст — 98 лет, но это не всегда будет верно. Там нет требований. - person Johnny Nguyen; 18.11.2012
comment
Я проверил свое первоначальное предложение, и оно с треском провалилось, поэтому я отредактировал свой ответ. Вы все еще должны ввести часть, чтобы вычислить возраст. - person Steve Wellens; 18.11.2012
comment
Вопрос помечен для Oracle, и Oracle не поддерживает синтаксис top 1 (хотя в 12g есть некоторые улучшения, которые можно использовать вместо этого). - person Justin Cave; 18.11.2012
comment
Я не знал, что Oracle не поддерживает top 1. Я думаю, вы можете использовать WHERE rownum = 1 (у меня нет Oracle на моей домашней машине, хотите верьте, хотите нет). - person Steve Wellens; 18.11.2012

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

select dr_drvname as "Name", 
       trunc( months_between( sysdate, dr_birthdate )/ 12 ) "Highest Age"
  from (select dr_drvname ,
               dr_birthdate,
               rank() over (order by dr_birthdate) rnk
          from driver)
 where rnk = 1;
person Justin Cave    schedule 18.11.2012