Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Cara menetapkan penghitung berdasarkan suatu kondisi

Solusi @PonderStibbons baik-baik saja, tetapi karena saya telah membuatnya sendiri, tidak berdasarkan rekursi, saya mempostingnya juga. Perhatikan bahwa akan ada perbedaan untuk kumpulan data lainnya. Khususnya, kueri ini mengasumsikan bahwa dalam rentang tertentu pkg_des . yang sama record, grup record dengan prd_desc DIBAYAR tidak terganggu oleh non-DIBAYAR nilai-nilai. Ini bukan asumsi yang dibuat dalam solusi rekursif, yang bisa menjadi faktor penting untuk membuang solusi saya:

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;

Outputnya sama untuk data sampel yang diberikan:

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

Saya menambahkan tanda bintang di mana outputnya berbeda dari apa yang Anda cantumkan dalam pertanyaan Anda, tetapi di atas adalah output ketika aturan diikuti ke huruf.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. System.InvalidCastException:Objek tidak dapat dilemparkan dari DBNull ke tipe lain

  2. Catatan yang dimasukkan ke dalam tabel saya melalui klien SQL tidak muncul saat digunakan dalam program jdbc

  3. Oracle otomatis menambahkan tanggal saat ini

  4. Apa perbedaan utama antara Varchar2 dan char

  5. Membuat tabel Database dalam SQL, kesalahan aneh