выбрать имя столбца с максимальной датой из различных столбцов в таблице - PullRequest
0 голосов
/ 08 апреля 2009

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

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

Ответы [ 3 ]

1 голос
/ 08 апреля 2009

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

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;

Если бы я хотел иметь дело с большим количеством столбцов, я бы вложил больше операторов case:

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 голосов
/ 15 октября 2009

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;
0 голосов
/ 08 апреля 2009

Я не очень знаком с оракулом, поэтому я избегаю специфических подходов к 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...