連続未払いの金額を取得する必要があります。
with payments as
(
select '1' as ID, '20130331' as DateR, 'Not_paid' as Status from dual
union
select '1' as ID, '20130430' as DateR, 'Paid' as Status from dual
union
select '1' as ID, '20130531' as DateR, 'Not_paid' as Status from dual
union
select '2' as ID, '20130331' as DateR, 'Not_paid' as Status from dual
union
select '2' as ID, '20130430' as DateR, 'Not_paid' as Status from dual
union
select '3' as ID, '20130331' as DateR, 'Paid' as Status from dual
union
select '3' as ID, '20130430' as DateR, 'Paid' as Status from dual
union
select '3' as ID, '20130531' as DateR, 'Paid' as Status from dual
)
select ID, dater, status, dense_rank() over (partition by ID, status order by dater asc) rnk from payments
これからわかるように、id 2 から適切な数の未払いが得られます。最初の未払いは 3 月で、2 回目は 4 月です。ID 3 も問題ありません。後で彼を除外するためです。そこからランキングを開始する必要があります。彼が最後の支払いを支払うと、プロセスが再び開始されます。
アイデアは、複雑なクエリを使用せずにシンプルに保つことです。密なランクと同じことをする必要がありますが、日付が連続している場合のみです
例が十分に明確であることを願っています。
編集:これは私が現在のクエリから得たものです:
ID DATER STATUS RNK
1 20130331 Not_paid 1
1 20130531 Not_paid 2
1 20130430 Paid 1
2 20130331 Not_paid 1
2 20130430 Not_paid 2
3 20130331 Paid 1
3 20130430 Paid 2
3 20130531 Paid 3
そして、私が取得したいのはこれです:
ID DATER STATUS RNK
1 20130331 Not_paid 1
1 20130430 Paid 1
1 20130531 Not_Paid 1
2 20130331 Not_paid 1
2 20130430 Not_paid 2
3 20130331 Paid 1
3 20130430 Paid 2
3 20130531 Paid 3
max(rank) を取得してユーザーの現在の未払い回数を確認したい場合、ID には 1 回の未払い、ID 2 には 2 回の連続した未払い、ID 3 には 0 回の未払いがあります。これは、4 回連続して未払いが発生した場合、ユーザーが解約されたと見なす必要があるためです。
編集:2013/06/29
誰かが別のフォーラムで完璧な解決策を教えてくれました: https://forums.oracle.com/thread/2555552