Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

एक शर्त के आधार पर काउंटर कैसे असाइन करें

@PonderStibbons का समाधान ठीक है, लेकिन जैसा कि मैंने खुद बनाया था, रिकर्सन पर आधारित नहीं, मैं इसे भी पोस्ट करता हूं। ध्यान दें कि अन्य डेटा सेट के लिए अंतर होगा। विशेष रूप से, यह क्वेरी मानती है कि समान pkg_des . की दी गई सीमा के भीतर रिकॉर्ड, रिकॉर्ड का समूह prd_desc . के साथ भुगतान किया गैर-भुगतान . द्वारा बाधित नहीं हैं मूल्य। यह पुनरावर्ती समाधान में की गई धारणा नहीं है, जो मेरे समाधान को त्यागने का एक महत्वपूर्ण कारक हो सकता है:

select   reg_id, pkg_des, prd_desc, event_date, event_type_cd,
         case when prd_desc = 'PAID'
              then greatest(0, -1+count(case when event_type_cd <> 'exp' then 1 end) 
                      over (partition by reg_id, pkg_des, prd_desc
                            order by     event_date asc
                            rows between unbounded preceding and 0 preceding)
                   )
              else 0
         end as renewal_cnt,
         case when   lag(prd_desc) over (partition by reg_id, pkg_des
                                         order by     event_date asc) = 'PAID' 
                 and prd_desc = 'PAID'
                 and event_type_cd = 'renewal'
              then 1 
              else 0 
         end is_ren, 
         case when   lag(prd_desc) over (partition by reg_id, pkg_des
                                         order by     event_date asc) = 'trail'
                 and prd_desc = 'PAID'
              then 1
              else 0
         end is_conv
from     temp
order by reg_id asc,
         pkg_des desc,
         event_date asc;

दिए गए नमूना डेटा के लिए आउटपुट समान है:

REG_ID | Pkg_DES | PRD_DESC | EVENT_DATE | event_type_cd | renewal_cnt | is_ren | is_conv
-------+---------+----------+------------+---------------+-------------+--------+--------   
    1  |  CC     |  trail   | 12-12-2012 |  new sub      |       0     |     0  |   0
    1  |  CC     |  trail   | 12-13-2012 |  exp          |       0     |     0  |   0
    1  |  CC     |  PAID    | 12-14-2012 |  upsell       |       0     |     0  |   1
    1  |  CC     |  PAID    | 12-15-2012 |  exp          |       0     |     0  |   0*
    1  |  CC     |  PAID    | 12-16-2012 |  renewal      |       1     |     1  |   0
    1  |  CC     |  PAID    | 12-17-2012 |  renewal      |       2     |     1  |   0
    1  |  aa     |  trail   | 12-12-2012 |  new sub      |       0     |     0  |   0 
    1  |  aa     |  trail   | 12-13-2012 |  exp          |       0     |     0  |   0
    1  |  aa     |  PAID    | 12-14-2012 |  renewal      |       0     |     0  |   1
    1  |  aa     |  PAID    | 12-15-2012 |  renewal      |       1     |     1  |   0
    1  |  aa     |  PAID    | 12-16-2012 |  upsell       |       2     |     0* |   0 
    1  |  aa     |  PAID    | 12-17-2012 |  renewal      |       3     |     1  |   0

मैंने एक तारांकन जोड़ा है जहां आउटपुट आपके प्रश्न में सूचीबद्ध से अलग है, लेकिन उपरोक्त आउटपुट है जब पत्र में नियमों का पालन किया जाता है।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ओरेकल सबक्वेरी में अमान्य पहचानकर्ता त्रुटि पर ध्यान नहीं देता

  2. Azure डेटा फ़ैक्टरी v2 . से Oracle संग्रहीत कार्यविधि को कैसे कॉल करें

  3. Oracle SQL:सीमांकित स्ट्रिंग के साथ पंक्ति को क्रमबद्ध करें

  4. 12c अनुकूली योजनाएं

  5. परिणामसेट वापस करने के लिए दूसरी तालिका की पंक्तियों पर पुनरावृति करें