如何按时间提供客户的状态

时间:2021-04-29 11:52:44

标签: oracle plsql

Table t_customer_statistics
trx_date - transaction date
cuid - id person(divide prospect and client)
lifecycle_status - this column must be filled

我需要根据客户的情况给他状态

  1. 被收购 - 本月是第一笔交易
  2. 存在 - 上个月有一笔交易
  3. 重新激活 - 上个月没有交易
  4. sleeping - 最近 90 天没有交易(自上次交易以来没有后续交易,超过 90 天) 我粗略的做了一个这样的代码
UPDATE t_customer_statistics
SET Lifecycle_status =
case
when to_char (trunc (trx_date, 'mm'), 'mm.yyyy') = to_char (trunc (sysdate, 'mm'), 'mm.yyyy') then 'acquired'
when to_char (trunc (trx_date, 'mm'), 'mm.yyyy') = to_char (trunc (sysdate, 'mm') - 1, 'mm.yyyy') then 'existing'
when to_char (trunc (trx_date, 'mm'), 'mm.yyyy') = to_char (trunc (sysdate, 'mm') - 40, 'mm.yyyy') then 'reactivated'
when to_char (trunc (trx_date, 'mm'), 'mm.yyyy') <to_char (trunc (sysdate, 'mm') - 90, 'mm.yyyy') then 'sleeping'
end

但是当他们给我举个例子的时候,如果客户端做了第一笔交易然后睡着了,那么他最后有两种状态,而且睡着必须分开,这样才有单独的 附注。必须从第一个和最后一个事务开始考虑

1 个答案:

答案 0 :(得分:0)

您可以像这样使用 MERGE 语句:

MERGE INTO clients dst
USING (
  SELECT rowid rid,
         LEAD(dt, 1) OVER (PARTITION BY id ORDER BY dt DESC) AS prev_dt,
         LAG(dt, 1) OVER (PARTITION BY id ORDER BY dt DESC) AS next_dt
  FROM   clients
) src
ON ( dst.ROWID = src.rid )
WHEN MATCHED THEN
  UPDATE
  SET status = CASE
               WHEN prev_dt IS NULL
               THEN 'acquired'
               WHEN MONTHS_BETWEEN(TRUNC(dst.dt, 'MM'), TRUNC(src.prev_dt)) <= 1
               THEN 'existing'
               ELSE 'reactivated'
               END
               ||
               CASE
               WHEN COALESCE(src.next_dt, SYSDATE) >= dst.dt + INTERVAL '90' DAY
               THEN ', sleeping'
               END;

对于样本数据:

CREATE TABLE clients (id, dt, status ) AS
SELECT 1, DATE '2020-01-01', CAST( NULL AS VARCHAR2(20) ) FROM DUAL UNION ALL
SELECT 1, DATE '2020-02-01', CAST( NULL AS VARCHAR2(20) ) FROM DUAL UNION ALL
SELECT 1, DATE '2020-03-01', CAST( NULL AS VARCHAR2(20) ) FROM DUAL UNION ALL
SELECT 1, DATE '2020-05-01', CAST( NULL AS VARCHAR2(20) ) FROM DUAL UNION ALL
SELECT 1, DATE '2020-09-01', CAST( NULL AS VARCHAR2(20) ) FROM DUAL UNION ALL
SELECT 1, DATE '2020-10-01', CAST( NULL AS VARCHAR2(20) ) FROM DUAL UNION ALL
SELECT 1, DATE '2020-10-01' + INTERVAL '91' DAY, CAST( NULL AS VARCHAR2(20) ) FROM DUAL;

那么MERGE的结果是:

<块引用>
<头>
ID DT 状态
1 01-JAN-20 获得
1 01-FEB-20 现有
1 01-MAR-20 现有
1 01-MAY-20 重新激活,休眠
1 01-SEP-20 重新激活
1 01-OCT-20 存在,睡眠
1 20 年 12 月 31 日 重新激活,休眠

db<>fiddle here