2

連続未払いの金額を取得する必要があります。

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

4

1 に答える 1

0

これはあなたの質問に対する完全な回答ではありませんが、各 ID の未払いの未払いの数を取得することは可能な解決策です。Not_paidステータスには値 1 を割り当て、Paidステータスには -1 を割り当てます。そのため、クエリを ID でグループ化し、値の列を合計して、未払いの支払いの数を取得できます。マイナスの合計については、未払いの支払いがないため、ゼロに割り当てます。

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,
       DECODE(SIGN(SUM(value)), -1, 0, SUM(value))
  FROM (SELECT id,
               dater,
               status,
               DECODE(status, 'Paid', -1, 1) value
          FROM payments
       )
 GROUP BY id
 ORDER BY id;

このクエリは、例のデータ セットでは機能しますが、より大きなデータ セットでは機能しない可能性があります。また、Not_paid ステータスに対して少なくとも同じ数の Paid ステータスがない場合は機能しません。たとえば、ID = 2の例では、アカウントが 5 月に全額支払われた場合、私のソリューションが機能するには、2 つの有料エントリがテーブルにロードされる必要があります。有料エントリが 1 つしかロードされていない場合、私のソリューションでは、この ID に必要な未払いの支払いが引き続き表示されます。

于 2013-06-27T18:18:33.247 に答える