あなたの例では、どのレコードが必要かはまだわかりません。いくつかの選択肢を紹介します。
問題の説明から、入手可能なものの最新の発効日が必要であると収集しました。関係があるため、max()
を使用することはできません (すでに述べたように)、およびrow_number()
行く方法です:
with cte as (
select
addrid, effectdt, xpirdt,
row_number() over (partition by addrid order by effectdt desc) as rn
from addrdata
)
select
addrid, effectdt, xpirdt
from cte
where rn = 1
次の部分は、nullで私を失った場所です... 2番目の並べ替えが有効期限によるもので、null値を最新の有効期限よりも優先させたい場合は、有効期限で注文し、nulls first
:
with cte as (
select
addrid, effectdt, xpirdt,
row_number() over
(partition by addrid order by effectdt desc, xpirdt nulls first) as rn
from addrdata
)
select
addrid, effectdt, xpirdt
from cte
where rn = 1
つまり、この行が勝者です:
10948448 5/14/2015 <null>
ただし、有効期限がない場合にのみnullを考慮したい場合は、nulls last
を使用できます。 (またはデフォルトなので省略します):
with cte as (
select
addrid, effectdt, xpirdt,
row_number() over
(partition by addrid order by effectdt desc, xpirdt nulls last) as rn
from addrdata
)
select
addrid, effectdt, xpirdt
from cte
where rn = 1
この男が賞を獲得したことを意味します:
10948448 5/14/2015 5/13/2015
これはrow_number()
を使用するため 行が失われることはありません。各行には行番号が保証されています。それは、本当の関係がある場合、どの行が選択されるかについてのトスアップであるということだけです。ただし、有効期限がnullであるという問題によって、このアプローチで問題が発生することはありません。
-2016年2月13日編集-
私は始めていると思います あなたの問題を理解するために、しかし私は100%確信していません。私はあなたのコードのスニペットを私の提案と一緒に左結合で組み込みました、そして最初にnullの有効期限を持つ必要があります、そしてこれは私の次の亀裂です:
with cte as (
select
addrid, effectdt, xpirdt,
row_number() over
(partition by addrid order by effectdt desc, xpirdt nulls first) as rn
from addrdata
)
select
cte.addrid, effectdt, xpirdt
from
mbr_person mb
left join partyxref px on
mb.nameid = px.nameid and
px.reftype = 'COMM'
left join cte on
px.refkey = cte.addrid and
cte.rn = 1
これがそれを行わないと仮定すると:
- null XPIRDTが優先されると言う場合、それはより最近の発効日を超えていることを意味しますか、それとも最新のEFFECTDTのタイブレーカーにすぎませんか?後者の場合、私が持っているものは機能するはずです。前者の場合、分析関数で順序を切り替える必要があります
-
partyxref
に関しては完全に推測しています およびmbr_person
テーブル。それでも問題が解決しない場合は、サンプルデータと、これら2つのテーブルを含めるための必要な出力を投稿するか、それともいじくりまわしますか?