Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Cách gán bộ đếm dựa trên một điều kiện

Giải pháp của @PonderStibbons là tốt, nhưng vì tôi đã tự tạo một giải pháp, không dựa trên đệ quy, tôi cũng đăng nó. Lưu ý rằng sẽ có sự khác biệt đối với các tập dữ liệu khác. Đáng chú ý, truy vấn này giả định rằng trong một phạm vi nhất định có cùng pkg_des bản ghi, nhóm bản ghi có prd_desc ĐÃ TRẢ TIỀN không bị gián đoạn bởi không TRẢ TIỀN các giá trị. Đây không phải là một giả định được thực hiện trong giải pháp đệ quy, có thể là một yếu tố quan trọng để loại bỏ giải pháp của tôi:

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;

Đầu ra giống nhau đối với dữ liệu mẫu đã cho:

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

Tôi đã thêm một dấu sao ở đó đầu ra khác với những gì bạn đã liệt kê trong câu hỏi của mình, nhưng ở trên là đầu ra khi các quy tắc được tuân theo đối với chữ cái.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. không thể nhận tham số từ thủ tục oracle được thực thi bởi mybatis

  2. Hàm JSON_QUERY () trong Oracle

  3. Oracle SQL cách viết câu lệnh sql xác minh xem người dùng trong mạng của tôi (tức là bạn bè hoặc bạn của bạn bè)

  4. TNS-12505:TNS:người nghe hiện không biết về SID được cung cấp trong bộ mô tả kết nối

  5. Tại sao tôi có ORA-00904 ngay cả khi cột này hiện diện?