从表中的各列选择具有最大日期的列名

时间:2009-04-08 15:15:34

标签: sql-server-2005 oracle10g

我有一个包含四列不同日期的表格。

我想检索具有最大日期的列名;任何人都可以帮忙解决这个问题吗?

3 个答案:

答案 0 :(得分: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的函数语法,你的db可能使用不同的语法,并且可能使用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; 

答案 1 :(得分:0)

我对oracle不太熟悉,所以我避免使用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

答案 2 :(得分: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;