2009-04-08 1 views
0

У меня есть таблица с четырьмя столбцами с разными датами.выберите имя столбца с максимальной датой из разных столбцов в таблице

Я хочу получить имя столбца с максимальной датой; может ли кто-нибудь помочь в том, как это сделать?

+0

какие имена столбцов, и у вас только одна максимальная дата для одного столбца? – TStamper

+0

Ваши объяснения неоднозначны: вам нужно указать имя столбца с последней датой в строке или строку с последней датой? – tpdi

+0

Какую платформу базы данных вы используете? Вопрос отмечен как Oracle, так и SQL Server. –

ответ

0

Я не очень хорошо знаком с оракулом, поэтому избегаю конкретных подходов SQL Server (кроме табличной переменной для целей примера), но способ решения проблемы, как было указано, - создать подзапрос, который объединяет четыре столбца и отображает имена столбцов, другой подзапрос, который извлекает максимум для 4 значений и внешний запрос, который возвращает объединенный результат. Ниже пример будет возвращать макс для таблицы, но это может быть скорректирован до максимума для строки путем модификации агрегирующего подзапроса к группе посредством идентификатора строки, а затем присоединение на этой колонке, а

Declare @x table(id int 
, date1 datetime 
, date2 datetime 
, date3 datetime 
, date4 datetime) 

insert into @x 
values (1, '01/01/2000' 
, '01/01/2001' 
, '01/01/2002', '01/01/2004') 

insert into @x 
values (2, '01/01/2010' 
, '01/01/2020' 
, '01/01/2030', '01/01/2040') 


Select SomeDate, ColumnName 
from 
(
Select date1 as somedate 
, 'Date 1' as ColumnName from @x 
union 
Select date2 as somedate 
, 'Date 2' as ColumnName from @x 
union 
Select date3 as somedate 
, 'Date 3' as ColumnName from @x 
union 
Select date4 as somedate 
, 'Date 4' as ColumnName from @x 
) t1 
inner join 
(
    Select max(tx.somedate) MaxDate from 
    (
     Select date1 as somedate from @x 
     union 
     Select date2 as somedate from @x 
     union 
     Select date3 as somedate from @x 
     union 
     Select date4 as somedate from @x 
    ) as tx 
) t2 
on t1.SomeDate = t2.MaxDate 
1

Если, на каждый ряд основе, я хотел последнюю дату в двух столбцах даты, я хотел бы использовать случай заявление:

select case when dt1 > d2 then dt1 else dt2 end as latest from table; 

Если бы я хотел имя столбца (и я не знаю, почему я хочу, чтобы):

select case when dt1 > d2 then 'dt1' else 'dt2' end as latest from table; 

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

select case when dt1 > d2 then 
    (case when dt1 > dt3 then dt1 else dt3 end) 
    else 
    (case when dt2 > dt3 then dt2 else dt3 end) 
    end as latest 
from table; 

Или, лучше, я мог бы сделать это следующим образом:

select case 
    when dt1 > d2 and dt1 > dt3 then dt1 
    when dt2 > d1 and dt2 > dt3 then dt2 
    else dt3 end as latest 
from table ; 

Или (возможно лучше) я мог бы напишите функцию. Поскольку max является встроенной функцией, я бы написал что-то, называемое maxOf. Это в синтаксисе функции MySQL, ваш дб может использовать другой синтаксис, и может использовать OUT переменные вместо возвращения значения:

create function maxOf(date lhs, date rhs) 
    RETURNS date 
    LANGUAGE SQL 
    DETERMINISTIC 
    CONTAINS SQL 
    COMMENT 'return the later of two dates' 
    return case when lhs > rhs then lhs else rhs end; 


select maxOf(dt1, maxOf(dt2, dt3) as latest from table; 
0

Oracle имеет наибольшее и наименьшее

SELECT GREATEST (TO_DATE ('01-01-2000', 'DD-MM-YYYY'), TO_DATE ('01-01-2010', 'DD-MM-YYYY')) FROM DUAL; 

SELECT LEAST (TO_DATE ('01-01-2000', 'DD-MM-YYYY'), TO_DATE ('01-01-2010', 'DD-MM-YYYY')) FROM DUAL; 
Смежные вопросы