从多个字段中选择最大/最小值

时间:2010-03-05 09:26:43

标签: sql sql-server tsql sybase-ase

在以下查询中,开始/结束列是日期时间字段。

我应该如何修改此查询以获得另外两列,一行包含最小日期,另一列包含每行重复的最大日期(所有6个日期时间字段和所有行)。

或者,我怎么能创建一个新的查询,只返回这两个(最小/最大)日期,当然对于相同的结果集?

非常感谢! (我想要SQL Server 2005和Sybase ASE 12.5.4的答案)

select  erg_mst.code, 
        erg_types.perigrafh, 
        erg_mst.FirstBaseStart, 
        erg_mst.FirstBaseFinish,
        erg_mst.LastBaseStart, 
        erg_mst.LastBaseFinish ,
        erg_mst.ActualStart, 
        erg_mst.ActualFinish 
from    erg_mst inner join 
        erg_types  on erg_mst.type = erg_types.type_code  
where   erg_mst.activemodule = 'co' 
and     (
            FirstBaseStart <> NULL OR 
            FirstBaseFinish <> NULL OR  
            LastBaseStart <> NULL OR 
            LastBaseFinish <> NULL OR 
            ActualStart <> NULL OR 
            ActualFinish <> NULL 
        )  
order by    isnull(FirstBaseStart,isnull(LastBaseStart,ActualStart))

2 个答案:

答案 0 :(得分:3)

请参阅下面的SQL Server 2005代码示例,使用Miles D建议使用一系列UNION的选择(抱歉,我不知道Sybase语法):

select min(AllDates) as MinDate, max(AllDates) as MaxDate
from
(
select erg_mst.FirstBaseStart as AllDates
from    erg_mst 
where   erg_mst.activemodule = 'co'
and     FirstBaseStart IS NOT NULL
union all
select erg_mst.FirstBaseFinish as AllDates
from    erg_mst 
where   erg_mst.activemodule = 'co'
and     FirstBaseFinish IS NOT NULL
union all
select erg_mst.LastBaseStart as AllDates
from    erg_mst 
where   erg_mst.activemodule = 'co'
and     LastBaseStart IS NOT NULL
union all
select erg_mst.LastBaseFinish as AllDates
from    erg_mst 
where   erg_mst.activemodule = 'co'
and     LastBaseFinish IS NOT NULL
union all
select erg_mst.ActualStart as AllDates
from    erg_mst 
where   erg_mst.activemodule = 'co'
and     ActualStart IS NOT NULL
union all
select erg_mst.ActualFinish as AllDates
from    erg_mst 
where   erg_mst.activemodule = 'co'
and     ActualFinish IS NOT NULL
) #Temp

答案 1 :(得分:1)

我可以想到两种解决方案,但两者都需要采用Lucer的评论来使用IS NOT NULL,而不是&lt;&gt; NULL。

  1. 创建一个两个用户定义的函数来返回最大值和最小值 - 好的,但假设您有权访问它。
  2. 使用一系列UNION选择,每个选择选择六列中的一列,然后将其用作内嵌套SELECT,然后使用SELECT MAX(),MIN()。