これがsqlfiddleの問題です
いくつかのテーブルが FULL OUTER JOINED になっています。この質問では、2 つのテーブルだけに単純化しました。FULL JOINS の理由は、プロダクション テーブルには一貫性のないさまざまなフィールドが多数あるためです。そのため、次の間で UNION ALL を実行しても機能しません。
create table dates1
(
USERID INT,
[Date] datetime
)
insert into dates1
values
( 1, '01 jan 2012'),
( 2, '03 jan 2012')
create table dates2
(
USERID INT,
[Date] datetime
)
insert into dates2
values
( 2, '01 jan 2012'),
( 4, '04 jan 2012')
各 USERID について、最小日付を見つける必要があります。これが試みです。プロダクションスクリプトでは4つまたは5つのテーブルが結合される可能性があるため、COALESCEを使用しました。
SELECT
COALESCE(x.USERID,y.USERID) USERID
, CASE WHEN x.[Date] < Y.[DATE]
THEN x.[Date]
ELSE Y.[DATE] END [DATE]
FROM
dates1 x
FULL OUTER JOIN dates2 y
ON x.USERID = y.USERID
上記は次を返します。これは、User1 の最小日付を 2012 年 1 月 1 日にする必要があるため、ユーザー 1 にとっては間違っています。
これらの日付を見つけるためのスケーラブルなスクリプトは何ですか?
私が使ってきた厄介な解決策はこれです:
SELECT
COALESCE(x.USERID,y.USERID) USERID
, CASE
WHEN ISNULL(x.[Date],'1 JAN 2020') < ISNULL(Y.[DATE],'1 JAN 2020')
THEN ISNULL(x.[Date],'1 JAN 2020')
ELSE ISNULL(Y.[DATE],'1 JAN 2020')
END [DATE]
FROM
dates1 x
FULL OUTER JOIN dates2 y
ON x.USERID = y.USERID