sql >> Database teknologi >  >> RDS >> Oracle

Sådan tildeler du tælleren baseret på en betingelse

Løsningen af ​​@PonderStibbons er fin, men da jeg selv havde lavet en, ikke baseret på rekursion, poster jeg den også. Bemærk, at der vil være forskelle for andre datasæt. Navnlig antager denne forespørgsel, at den er inden for et givet område af samme pkg_des records, gruppen af ​​poster med prd_desc BETALT ikke afbrydes af ikke-BETALT værdier. Dette er ikke en antagelse i den rekursive løsning, hvilket kunne være en vigtig faktor for at kassere min løsning:

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;

Output er det samme for de givne eksempeldata:

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

Jeg tilføjede en stjerne, hvor outputtet er forskelligt fra det, du angav i dit spørgsmål, men ovenstående er outputtet, når reglerne følges til punkt og prikke.



  1. mysql opret tabel dynamisk

  2. Dvale annoteringer - Ufølsom for store og små bogstaver UniqueConstraint

  3. Fjern det sidste komma eller forhindre det i at blive udskrevet i MySQL/PHP

  4. hvordan man returnerer et dynamisk resultatsæt i Oracle-funktionen