これは、OUTER APPLY を使用して 2 つの兄を取得します。
select m.*, elder.*
from Member m
outer apply
(
select top 2 ElderBirthDate = x.BirthDate, ElderFirstname = x.Firstname
from Member x
where x.BirthDate < m.BirthDate
order by x.BirthDate desc
) as elder
order by m.BirthDate, elder.ElderBirthDate desc
ソースデータ:
create table Member
(
Firstname varchar(20) not null,
Lastname varchar(20) not null,
BirthDate date not null unique
);
insert into Member(Firstname,Lastname,Birthdate) values
('John','Lennon','Oct 9, 1940'),
('Paul','McCartney','June 8, 1942'),
('George','Harrison','February 25, 1943'),
('Ringo','Starr','July 7, 1940');
出力:
Firstname Lastname BirthDate ElderBirthDate ElderFirstname
-------------------- -------------------- ---------- -------------- --------------------
Ringo Starr 1940-07-07 NULL NULL
John Lennon 1940-10-09 1940-07-07 Ringo
Paul McCartney 1942-06-08 1940-10-09 John
Paul McCartney 1942-06-08 1940-07-07 Ringo
George Harrison 1943-02-25 1942-06-08 Paul
George Harrison 1943-02-25 1940-10-09 John
(6 row(s) affected)
ライブ テスト: http://www.sqlfiddle.com/#!3/19a63/2
マークの答えの方が優れています。「近い」エンティティ(地理空間、兄、期日までの最も近い日付など)をメインエンティティに照会する必要がある場合は、 OUTER APPLY を使用してください。
外部適用のチュートリアル: http://www.ienablemuch.com/2012/04/outer-apply-walkthrough.html
ROW_NUMBER/RANK の代わりに DENSE_RANK が必要になる場合があります。これは、コメントがトップであるという基準が引き分けになる可能性があるためです。TOP 1 は 1 つ以上、TOP 3 は 3 つ以上を生成する可能性があります。そのシナリオの例 (DENSE_RANK ウォークスルー): http://www.anicehumble.com/2012/03/postgresql-denserank.html