sql >> Databáze >  >> RDS >> Oracle

Jak přiřadit čítač na základě podmínky

Řešení @PonderStibbons je v pořádku, ale protože jsem si jej vytvořil sám, nikoli na základě rekurze, zveřejňuji ho také. Všimněte si, že u jiných souborů dat budou rozdíly. Tento dotaz zejména předpokládá, že v daném rozsahu je stejný pkg_des záznamy, skupina záznamů s prd_desc ZAPLACENO nejsou přerušovány tím, že nejsou PLACENÉ hodnoty. Toto není předpoklad vytvořený v rekurzivním řešení, což by mohl být důležitý faktor pro zrušení mého řešení:

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;

Výstup je pro daná ukázková data stejný:

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

Přidal jsem hvězdičku, kde se výstup liší od toho, co jste uvedli ve své otázce, ale výše uvedený je výstup, když jsou pravidla dodržena do písmene.



  1. Jak generovat příkazy INSERT z dotazu při použití SQLcl (Oracle)

  2. 3 způsoby, jak zjistit, zda je sloupec vypočítaným sloupcem na serveru SQL

  3. Výkon dynamického SQL vs. uložené procedury na Oracle

  4. Předání hodnoty načtené z databáze na jinou stránku pomocí php a mysql