Oracle 12.1以降では、match_recognize
は、このような要件の迅速な作業を行うことができます。 (1つの利点は、解析効率の高いソリューションと比較して、この効率を達成するためにサブクエリを必要とせずに、ID
ごとにただ1人のユーザーに対してmax(version)
が計算されることです)。
id
とそれぞれのid
の区切りでは、バージョン(昇順)で区切られます。次に、「一致」はパーティションの先頭からのみ(pattern
句の^
)、最初の行と同じ(id
で)id
の行のみで構成されます。そのid
の他の行はすべて無視されます。その後、最後のバージョン値が出力用に収集されます。
注:これは前提と、その与えられたIDのため、最初のユーザの第二、第三等の変更しかしは最初ユーザ、行のFIRSTセットから最高のバージョン番号に戻る場合そのユーザーのために必要です。そのユーザーのすべての行から最も高いバージョン番号が必要な場合は、それに応じて問合せを変更できます(特にPATTERN句に変更が必要)。
with
inputs (id, usr, ver) as (
select 1, 123, 1 from dual union all
select 1, 123, 2 from dual union all
select 1, 123, 3 from dual union all
select 1, 456, 4 from dual union all
select 1, 456, 5 from dual union all
select 1, 789, 6 from dual union all
select 2, 452, 1 from dual union all
select 2, 452, 2 from dual union all
select 2, 587, 3 from dual union all
select 2, 123, 4 from dual union all
select 3, 901, 1 from dual union all
select 3, 767, 2 from dual union all
select 3, 456, 3 from dual
)
-- End of simulated inputs (not part of the solution).
-- SQL query begins BELOW THIS LINE. Use your actual table and column names.
select id, usr, ver
from inputs
match_recognize (
partition by id
order by ver
measures last(usr) as usr,
last(ver) as ver
pattern (^ a+)
define a as usr = first(usr)
);
ID USR VER
-- --- ---
1 123 3
2 452 2
3 901 1
EDIT:完全性については
は、ここでは(たとえ非利用者が非連続した行の上に表示される可能性がある場合のパターンがどのように見えるかで、そのユーザの非常に最後に出現所与id
用)の連続が考慮されなければならない:
...
pattern (^ a (x* a)?)
...
ここパーティション内の最初の行はであり、同じユーザが再び表示された場合同じid
の場合、少なくとも1つ以上あります。行です。 最後のこのような行はパターンの任意の部分でキャッチされ、貪欲な一致はx*
にあります。
ID = 1の場合、Version 1、2、3ではUser = 123、バージョン7ではUser = 123となります(サンプルデータには存在しませんが、ID =ユーザー= 123、バージョン= 7)。その場合、どのバージョンを選択する必要がありますか?3または7?そのユーザーの行が連続していないことに気をつけますか? – mathguy
それはそうではありませんが、それがそうであれば、私の要件は「最初の最終バージョン」を選択することであり、ユーザによるすべての保存は新しいバージョンであり、最後の保存を探していますそのレコードを編集した最初のユーザーの – Skn
OK - Gordonの解決策が役に立たない場合、そのIDを持つCONSECUTIVE行を識別するために余分なレイヤーが必要です。 "それは起こり得ない"が問題ではありませんが、それについては100%確実にする必要があります(現在も将来も!)私が提供したソリューションは、必要なものを提供しますが、Oracle 12.1または高い。あなたのOracleのバージョンは何ですか?確かなことが分からない場合は、 'select * from v $ version'を実行し、完全なバージョン番号(11.2.0.4.0や12.1.0.2.0など)を共有してください。 – mathguy