У меня есть база данных, в которой в одном столбце есть группы, а в другом — даты выпуска их альбомов. Как мне найти самую старую группу по разнице между датами их выпуска? т.е. самая старая группа не Band1, потому что они впервые выпустили альбом в 1968 году, по моему методу Band1 всего 7 лет (или активна в течение 7 лет, может быть лучше), а Band2 26 лет (годы активности), потому что 2001 - 1975 = 26.
Например:
Band......Rel_date
Band1....12/12/68
Band1....08/05/75
Band2....09/02/75
Band2....05/05/99
Band2....03/05/01
Я не понимаю, как это отвечает на мой вопрос. Я спрашиваю, как мне найти самое старое, не просто найдя самое старое значение, а найдя самое старое, найдя наибольшее количество времени между самым последним альбомом и первым альбомом.
Я полагаю, что время активности было бы лучшей формулировкой, потому что я пытаюсь найти группу с наибольшим количеством времени между их старыми и самыми последними альбомами.
Если я понимаю, что вы спрашиваете
SELECT BAND
FROM YOUR_TABLE
WHERE REL_DATE = (SELECT MIN(REL_DATE)
FROM YOUR_TABLE)
должен сделать это.
На основании дополнительной информации
WITH cteBand_activity AS
(SELECT BAND,
MIN(RELEASE_DATE) AS FIRST_RELEASE_DATE,
MAX(RELEASE_DATE) AS LATEST_RELEASE_DATE,
TRUNC((MAX(RELEASE_DATE) - MIN(RELEASE_DATE)) / 365) + 1 AS YEARS_ACTIVE
FROM ALBUMS
GROUP BY BAND
ORDER BY YEARS_ACTIVE DESC)
SELECT BAND, YEARS_ACTIVE
FROM cteBand_activity
WHERE ROWNUM = 1
должен дать результат, который вы ищете.
Удачи.
Спасибо! Но я неправильно сформулировал свой вопрос. Я спрашиваю, как бы я вычислил, сколько лет группе, взяв их последний выпуск альбома и вычтя их первый выпуск альбома, чтобы найти их возраст. (возможно, годы активности могли бы быть лучшим термином для его описания)
Написание хороших вопросов требует практики. Держись! Не сдавайся.
Оракул 12с+
select band from your_table order by rel_date fetch first 1 rows only;
Если вы хотите включить галстуки, измените его на with ties
вместо only
РЕДАКТИРОВАТЬ
select band from t
group by band order by max(rel_date) - min(rel_date) desc fetch first 1 rows only;
РЕДАКТИРОВАТЬ2
Для версий Oracle до 12c:
select * from
(
select band from t
group by band order by max(rel_date) - min(rel_date) desc
) where rownum = 1
Спасибо! Но я неправильно сформулировал свой вопрос. Я спрашиваю, как мне определить, сколько лет группе, взяв их последний выпущенный альбом и вычтя их первый альбом, чтобы найти, сколько лет они были активны.
Пожалуйста, задайте другой вопрос с правильными деталями, если это так.
Это не позволит мне задать еще один вопрос.. Как бы это лучше сформулировать? потому что кажется, что несколько человек неправильно поняли.
@iandrepont: см. правки
@iandrepont - дело не столько в "Несколько человек неправильно поняли", сколько в том, что вы не совсем четко объяснили свое требование в первый раз.
@Kaushik Nayak - Огромное спасибо. Хотя это дает мне ошибку с частью «выбрать только первые 1 строки». Пишет, что команда SQL введена неправильно. В настоящее время я пытаюсь найти решение, но если вы знаете, что это может быть, это тоже было бы здорово узнать.
@iandrepont: проверьте мое второе редактирование, вы используете более старую версию Oracle. Как я уже упоминал в первой строке своего ответа, fetch first
был только для версий Oracle 12c и выше.
У Oracle есть несколько различных способов решения этой проблемы, а более поздние версии предлагают более широкий выбор реализации. Связанная нить охватывает все варианты.