1. ホーム
  2. sql

[解決済み] MINやMAXにNULL値を含めるにはどうしたらいいですか?

2023-07-10 22:10:27

質問

私はタイムスパンデータを保存するテーブルを持っています。

ID INT NOT NULL IDENTITY(1,1)   
RecordID INT NOT NULL  
StartDate DATE NOT NULL  
EndDate DATE NULL  

そして、私は各レコードIDの開始日と終了日、つまり最小のStartDateと最大のEndDateをワークアウトしようとしています。StartDateはnullableではないので、私はこれについて心配する必要はありませんが、私はこれが現在実行中の期間であることを示すためにMAX(EndDate)を必要としています。

EndDateのNULL値を維持し、これを最大値として扱うことが重要です。

MINとMAXがNULLを無視するという問題を強調する最も単純な試み(下記)は動作しません(ソースはこちら)。 http://technet.microsoft.com/en-us/library/ms179916.aspx ).

SELECT recordid, MIN(startdate), MAX(enddate) FROM tmp GROUP BY recordid

基本的な設定を済ませたSQL Fiddleを作成しました。

http://sqlfiddle.com/#!3/b0a75

SQLFiddleで与えられたデータから次の結果を得るために、どのようにSQL Server 2008を自分の意志に従わせることができるでしょうか?

RecordId  Start       End  
1         2009-06-19  NULL
2         2012-05-06  NULL
3         2013-01-25  NULL
4         2004-05-06  2009-12-01

どのように解決するのですか?

少し醜いですが NULL には特別な意味があるので、これが私が考える最もきれいな方法です。

SELECT recordid, MIN(startdate),
   CASE WHEN MAX(CASE WHEN enddate IS NULL THEN 1 ELSE 0 END) = 0
        THEN MAX(enddate)
   END
FROM tmp GROUP BY recordid

つまり、ある行に NULL がある場合、それを強制的に答えにしたいのです。を含む行がない場合のみ NULL を含まない場合のみ MIN (または MAX ).