他の列の中に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型の関数が既に組み込まれていることが頭の中にありました。
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')
select ID,
case
when Date1 > Date2 then Date1
else Date2
end as MostRecentDate
from MyTable
これをスカラー関数に入れると、ヌルの処理が少し簡単になります。明らかに、インラインの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
SQL Server 2012から、 IIF
からCASE
式へのショートカットを使用できます。後者はSQL標準です。
SELECT ID,
IIF(DateColA > DateColB, DateColA, DateColB) AS MostRecentDate
FROM theTable
可能な場合は常に、インライン関数を使用します。UDFに通常関連するパフォーマンスの問題は発生しないためです...
Create FUNCTION MaximumDate
(
@DateTime1 DateTime,
@DateTime2 DateTime
)
RETURNS TABLE
AS
RETURN
(
Select Case When @DateTime1 > @DateTime2 Then @DateTime1
Else @DateTime2 End MaxDate
)
GO
使用ガイドラインについては、 ここ を参照してください
受け入れられた答えは最も簡単だと思います。しかし、私は日付のnull値を監視します...
SELECT ID,
CASE WHEN ISNULL(Date1,'01-01-1753') > ISNULL(Date2,'01-01-1753') THEN Date1
ELSE Date2
END AS MostRecentDate
FROM Table
ケースステートメント以外では、私はそうは思わない...
Select Case When DateColA > DateColB Then DateColA
Else DateColB End MostRecent
From Table ...
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
select max(d) ChangeDate
from (values(@d), (@d2)) as t(d)
すでに投稿されている他のすべての正解。
しかし、まだMAXキーワードを探しているのなら、ここに方法があります:
select ID , MAX(dt) from
( select Id , Date1 as dt from table1
union
select ID , Date2 from table2
) d
group by d.Id