Выбор максимального / минимального значения из нескольких полей - PullRequest
2 голосов
/ 05 марта 2010

В следующем запросе столбцы начала / окончания являются полями даты и времени.

Как мне изменить этот запрос, чтобы получить еще два столбца, один с минимальной датой и один с максимальной датой (из всех 6 полей даты-времени и всех строк), повторенных в каждой строке.

В качестве альтернативы, как я могу создать новый запрос, возвращающий только эти 2 (мин / макс) даты, для того же набора результатов, конечно?

Спасибо большое! (Я хотел бы получить ответы как для 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 ]

3 голосов
/ 09 марта 2010

Ниже приведен пример кода 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 голос
/ 05 марта 2010

Я могу придумать два решения, но оба должны будут принять во внимание комментарий Люцера, чтобы использовать IS NOT NULL вместо <> NULL.

  1. Создать две пользовательские функции для возврата максимального и минимального значений - хорошо, но предполагается, что у вас есть доступ для этого.
  2. Используйте серию операций выбора UNION, каждый из которых выбирает один из шести столбцов, а затем используйте его как внутренний вложенный SELECT, где вы затем используете SELECT MAX (), MIN () из этого.
...