web-dev-qa-db-ja.com

2つの列の間で最新の日付を選択する

他の列の中に2つのDATETIME列があるテーブルがある場合、これらの2つの列から最新日付を選択するにはどうすればよいですか。

例:

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-compare型の関数が既に組み込まれていることが頭の中にありました。

23
TheTXI

CASEは私にとって最良の選択肢です。

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

列の1つがNULL可能である場合は、 COALESCE で囲む必要があります。

.. COALESCE(Date1, '1/1/1973') > COALESCE(Date2, '1/1/1973')
40
Rockcoder
select ID, 
case
when Date1 > Date2 then Date1
else Date2
end as MostRecentDate
from MyTable
5
RedFilter

これをスカラー関数に入れると、ヌルの処理が少し簡単になります。明らかに、インラインの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
Michael Haren

SQL Server 2012から、 IIF からCASE式へのショートカットを使用できます。後者はSQL標準です。

SELECT ID,
       IIF(DateColA > DateColB, DateColA, DateColB) AS MostRecentDate
  FROM theTable
3

可能な場合は常に、インライン関数を使用します。UDFに通常関連するパフォーマンスの問題は発生しないためです...

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

使用ガイドラインについては、 ここ を参照してください

2
Charles Bretana

受け入れられた答えは最も簡単だと思います。しかし、私は日付のnull値を監視します...

SELECT ID,
       CASE WHEN ISNULL(Date1,'01-01-1753') > ISNULL(Date2,'01-01-1753') THEN Date1
            ELSE Date2
       END AS MostRecentDate
FROM Table
2
JStevens

ケースステートメント以外では、私はそうは思わない...

  Select Case When DateColA > DateColB Then DateColA 
              Else DateColB End MostRecent
  From Table ... 
1
Charles Bretana

このスレッド にはいくつかの解決策があります。比較する日付が3つ以上ある場合は、一連のケースステートメントを記述するよりも「アンピボット」の方が適している場合があります。以下は Niikola から露骨に盗まれたものです。

select id, max(dDate) MostRecentDate
  from YourTable
    unpivot (dDate for nDate in (Date1, Date2, Date3)) as u
  group by id 

次に、order by dDate、それが役立つ場合。

0
Michael

AFAIK、最大2つの値を取得する組み込み関数はありませんが、次のように簡単に独自の値を記述できます。

CREATE FUNCTION dbo.GetMaximumDate(@date1 DATETIME, @date2 DATETIME)
RETURNS DATETIME
AS
BEGIN
    IF (@date1 > @date2)
        RETURN @date1
    RETURN @date2
END

そしてそれを

SELECT Id, dbo.GetMaximumDate(Date1, Date2)
FROM tableName
0
Recep
select max(d) ChangeDate
from (values(@d), (@d2)) as t(d)
0
syb

すでに投稿されている他のすべての正解。

しかし、まだMAXキーワードを探しているのなら、ここに方法があります:

select ID , MAX(dt) from 
(  select Id , Date1 as dt from table1
   union  
   select ID , Date2 from table2
) d
group by d.Id
0
Dhananjay