2013-06-27 2 views
2

연속 기간 동안 순위 첫 unpayment 월에했다, 그리고 두 번째 4 월. Id 3은 나중에 그를 제외시킬 것이기 때문에 역시 괜찮습니다. 그러나 id 1의 경우 두 번째 지불 기한은 5 월이었고 3 월에 지불하지 않았기 때문에 첫 번째로 만들고 싶었지만 4 월에 다시 지불 했으므로 거기서 랭킹이 시작됩니다. 그가 마지막 지불을하면 프로세스가 다시 시작됩니다.I 연속 unpayments의 양을 얻을 필요가

아이디어는 복잡한 쿼리없이 간단하게 유지하는 것입니다. 밀도가 높은 순위와 동일하게 처리해야하지만 날짜가 연속 일 때만 가능합니다.

예제가 명확 해 주시기 바랍니다.

편집

:

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 

이러한 것을 나는 최대를 얻으려면 (등급)을 사용하여 사용자가 현재 지불하고있는 미 지불 금액을 확인합니다. 미납금이 1 건 있고 ID 2가 두 번 연속 지급되지 않으며 ID 3에는 미납금이 있습니다. 이것은 연속 된 4 번째 미납시에 사용자를 혼란스러운 것으로 간주해야하기 때문입니다.

편집 :이 질문에 완벽한 대답은 아니지만,이 얻을 수있는 가능한 솔루션입니다 https://forums.oracle.com/thread/2555552

+0

예상 출력을 표시 할 수 있습니까? 'LAG'을 사용하여 이전 상태를 확인할 수 있습니다. 이는 연속 된 값을 결정할 때 도움이됩니다. –

+1

안녕하세요 에드, 나는 내가 기대하는 것을 더 분명하게하기 위해 글을 편집했다. LAG를 사용해 보았지만 8 백만 행이있는 테이블을 통해 쿼리해야하고 처리하는 데 시간이 오래 걸리지 만 조밀 한 순위는 몇 초 정도 걸리며 결과와 함께 더 쉽게 작업 할 수 있습니다. – vdBurg

답변

0

: 29/06/2013

누군가가 나에게 또 다른 포럼에서 완벽한 솔루션을 준 각 ID에 대한 미납 지불 건수. Not_paid 상태에 대해 1 값을 지정하고 유료 상태에 -1 값을 지정합니다. 그러면 ID별로 쿼리를 그룹화하고 값 열을 합계하여 미납금 수를 계산할 수 있습니다. 음수 인 금액의 경우 Google은 미결제 금액이 없으므로 0으로 지정합니다.

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 상태에 대해 동일한 수의 유료 상태가 없으면 작동하지 않습니다. 예를 들어 ID = 2에 대한 예에서 5 월에 계정에 대한 대금이 전액 지불되면 내 솔루션이 작동하려면 2 개의 유료 항목이 테이블에로드되어야합니다. 지불 항목이 1 개만로드 된 경우에도 내 솔루션에는이 ID에 필요한 미 지불액이 표시됩니다.

+0

고마워! 부분적인 해결책 일 수도 있지만 오라클 포럼에서는 완벽한 답을 얻었습니다. 다른 사람이 관심이있는 경우 링크로 댓글을 수정했습니다. – vdBurg

관련 문제