Выбор самой последней даты между двумя столбцами - PullRequest
22 голосов
/ 05 января 2009

Если у меня есть таблица, в которой (среди других столбцов) есть два столбца DATETIME, как мне выбрать самую последнюю дату из этих двух столбцов.

Пример:

ID     Date1     Date2

1      1/1/2008   2/1/2008

2      2/1/2008   1/1/2008

3      1/10/2008  1/10/2008

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

ID     MostRecentDate

1      2/1/2008

2      2/1/2008

3      1/10/2008

Есть ли простой способ сделать это, что я, очевидно, упускаю из виду? Я знаю, что могу выполнять подзапросы и операторы case или даже писать функцию на сервере sql, чтобы справиться с этим, но у меня было в голове, что уже была встроена функция типа max-сравнение, о которой я просто забыл.

Ответы [ 12 ]

38 голосов
/ 05 января 2009

СЛУЧАЙ - ИМХО ваш лучший вариант:

SELECT ID,
       CASE WHEN Date1 > Date2 THEN Date1
            ELSE Date2
       END AS MostRecentDate
FROM Table

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

.. COALESCE(Date1, '1/1/1973') > COALESCE(Date2, '1/1/1973')
5 голосов
/ 05 января 2009

Вы можете добавить это в скалярную функцию, которая немного упрощает обработку нулей. Очевидно, что это не будет быстрее, чем встроенный оператор case.

ALTER FUNCTION [fnGetMaxDateTime] (
    @dtDate1        DATETIME,
    @dtDate2        DATETIME
) RETURNS DATETIME AS
BEGIN
    DECLARE @dtReturn DATETIME;

    -- If either are NULL, then return NULL as cannot be determined.
    IF (@dtDate1 IS NULL) OR (@dtDate2 IS NULL)
        SET @dtReturn = NULL;

    IF (@dtDate1 > @dtDate2)
        SET @dtReturn = @dtDate1;
    ELSE
        SET @dtReturn = @dtDate2;

    RETURN @dtReturn;
END
5 голосов
/ 05 января 2009
select ID, 
case
when Date1 > Date2 then Date1
else Date2
end as MostRecentDate
from MyTable
2 голосов
/ 05 сентября 2017

С SQL Server 2012 возможно использовать выражение от IIF до CASE, хотя последнее является стандартом SQL:

SELECT ID,
       IIF(DateColA > DateColB, DateColA, DateColB) AS MostRecentDate
  FROM theTable
2 голосов
/ 06 мая 2015

Я думаю, что принятый ответ является самым простым. Тем не менее, я бы следил за нулевыми значениями в датах ...

SELECT ID,
       CASE WHEN ISNULL(Date1,'01-01-1753') > ISNULL(Date2,'01-01-1753') THEN Date1
            ELSE Date2
       END AS MostRecentDate
FROM Table
2 голосов
/ 05 января 2009

По возможности используйте функции InLine, поскольку они не страдают ни одной из проблем производительности, обычно связанных с пользовательскими функциями ...

Create FUNCTION MaximumDate 
(   
@DateTime1 DateTime,
@DateTime2 DateTime
)
RETURNS TABLE 
AS
RETURN 
(
    Select Case When @DateTime1 > @DateTime2 Then @DateTime1
                Else @DateTime2 End MaxDate
)
GO 

Инструкции по использованию см. Здесь

1 голос
/ 05 января 2009

Кроме заявления случая, я не верю в это ...

  Select Case When DateColA > DateColB Then DateColA 
              Else DateColB End MostRecent
  From Table ... 
0 голосов
/ 23 апреля 2017
select max(d) ChangeDate
from (values(@d), (@d2)) as t(d)
0 голосов
/ 28 ноября 2014

Почему вы не можете использовать функцию GREATEST?

select id, date1, date2, GREATEST( nvl(date1,date2) , nvl(date2, date1) )
from table1;

Я включил NVL, чтобы гарантировать, что NULL был оценен правильно, иначе, если Date1 или Date2 равны NULL, Величайший возвращает NULL.

ID  Date1       Date2       MostRecentDate
1   1/1/2008    2/1/2008    2/1/2008
2   2/1/2008    1/1/2008    2/1/2008
3   1/10/2008   1/10/2008   1/10/2008
4   -null-      2/10/2008   2/10/2008
5   2/10/2008   -null-      2/10/2008
0 голосов
/ 13 апреля 2012

Все остальные правильные ответы уже опубликованы.

Но если вы все еще действительно ищете ключевое слово MAX, то вот способ:

select ID , MAX(dt) from 
(  select Id , Date1 as dt from table1
   union  
   select ID , Date2 from table2
) d
group by d.Id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...