sql >> Database >  >> RDS >> Oracle

Hoe de teller toe te wijzen op basis van een voorwaarde

De oplossing van @PonderStibbons is prima, maar aangezien ik er zelf een had gemaakt, niet op basis van recursie, post ik hem ook. Merk op dat er verschillen zullen zijn voor andere datasets. Deze zoekopdracht gaat er met name van uit dat binnen een bepaald bereik van dezelfde pkg_des records, de groep records met prd_desc BETAALD worden niet onderbroken door niet-BETAALD waarden. Dit is geen aanname in de recursieve oplossing, wat een belangrijke factor zou kunnen zijn om mijn oplossing te negeren:

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;

De uitvoer is hetzelfde voor de gegeven voorbeeldgegevens:

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

Ik heb een asterisk toegevoegd waar de uitvoer afwijkt van wat u in uw vraag hebt vermeld, maar het bovenstaande is de uitvoer wanneer de regels tot op de letter worden gevolgd.



  1. Zelfstudie Microsoft TreeView Control

  2. PHP gebruiken om afbeeldingen naar een map te uploaden terwijl beschrijvingen in een database worden opgeslagen

  3. Moet ik NULL of een lege tekenreeks gebruiken om geen gegevens in de tabelkolom weer te geven?

  4. mysql -v opdrachtregelfout (linux/ubuntu)