Blame view

项目文档相关/sql/修复会员沉睡天数数据.sql 3.07 KB
d8035736   “wangming”   Refactor project ...
1
  -- 修复会员沉睡天数数据
e1dcb3a0   “wangming”   1
2
3
4
  -- 问题:LastConsumeTime 与有效耗卡 MAX(hksj) 不一致(含零金额耗卡、LastConsumeTime 偏新/偏旧)
  -- 解决方案:不限制消耗金额,按有效耗卡 MAX(hksj) 纠正 LastConsumeTime,并按运行时/批量口径重算 SleepDaysSleepStartTime
  -- 沉睡阈值默认 60 天(与 MemberInfoUpdateConfig.SleepDaysThresholds 最小值一致)
d8035736   “wangming”   Refactor project ...
5
6
7
8
9
10
11
12
13
14
  
  -- 1. 修复单个会员(陈秋竹)
  UPDATE lq_khxx kh
  INNER JOIN (
      SELECT 
          hy,
          MAX(hksj) as last_consume_time
      FROM lq_xh_hyhk
      WHERE hymc = '陈秋竹'
          AND F_IsEffective = 1
d8035736   “wangming”   Refactor project ...
15
16
17
18
      GROUP BY hy
  ) consume ON kh.F_Id = consume.hy
  SET 
      kh.F_LastConsumeTime = consume.last_consume_time,
e1dcb3a0   “wangming”   1
19
20
21
22
23
24
25
26
27
      kh.F_SleepDays = GREATEST(0, DATEDIFF(CURDATE(), consume.last_consume_time)),
      kh.F_SleepStartTime = CASE 
          WHEN GREATEST(0, DATEDIFF(CURDATE(), consume.last_consume_time)) >= 60
              AND kh.F_SleepStartTime IS NULL 
          THEN DATE(consume.last_consume_time)
          WHEN GREATEST(0, DATEDIFF(CURDATE(), consume.last_consume_time)) < 60
          THEN NULL
          ELSE kh.F_SleepStartTime
      END
d8035736   “wangming”   Refactor project ...
28
29
30
  WHERE kh.khmc = '陈秋竹'
      AND kh.F_IsEffective = 1;
  
e1dcb3a0   “wangming”   1
31
  -- 2. 批量修复所有会员(根据最新的有效耗卡记录更新 LastConsumeTime
d8035736   “wangming”   Refactor project ...
32
33
34
35
36
37
38
39
  -- 注意:执行此SQL前请先备份数据库
  UPDATE lq_khxx kh
  INNER JOIN (
      SELECT 
          hy,
          MAX(hksj) as last_consume_time
      FROM lq_xh_hyhk
      WHERE F_IsEffective = 1
d8035736   “wangming”   Refactor project ...
40
41
42
43
      GROUP BY hy
  ) consume ON kh.F_Id = consume.hy
  SET 
      kh.F_LastConsumeTime = consume.last_consume_time,
e1dcb3a0   “wangming”   1
44
45
46
47
48
49
50
51
52
      kh.F_SleepDays = GREATEST(0, DATEDIFF(CURDATE(), consume.last_consume_time)),
      kh.F_SleepStartTime = CASE 
          WHEN GREATEST(0, DATEDIFF(CURDATE(), consume.last_consume_time)) >= 60
              AND kh.F_SleepStartTime IS NULL 
          THEN DATE(consume.last_consume_time)
          WHEN GREATEST(0, DATEDIFF(CURDATE(), consume.last_consume_time)) < 60
          THEN NULL
          ELSE kh.F_SleepStartTime
      END
d8035736   “wangming”   Refactor project ...
53
54
  WHERE kh.F_IsEffective = 1
      AND (
e1dcb3a0   “wangming”   1
55
          -- 纠正 LastConsumeTime 为空、偏旧或偏新的脏数据
d8035736   “wangming”   Refactor project ...
56
          kh.F_LastConsumeTime IS NULL 
e1dcb3a0   “wangming”   1
57
          OR kh.F_LastConsumeTime <> consume.last_consume_time
d8035736   “wangming”   Refactor project ...
58
59
      );
  
e1dcb3a0   “wangming”   1
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
  -- 3. 无有效耗卡会员的 fallbackLastConsumeTime 置空,SleepDays  F_CreateTime 计算)
  -- 建议优先调用 APIPOST /api/Extend/LqKhxx/BatchUpdateMemberInfo
  -- 若需 SQL 手工修复,可参考:
  -- UPDATE lq_khxx kh
  -- LEFT JOIN (
  --     SELECT hy, MAX(hksj) AS last_consume_time
  --     FROM lq_xh_hyhk
  --     WHERE F_IsEffective = 1
  --     GROUP BY hy
  -- ) consume ON kh.F_Id = consume.hy
  -- SET
  --     kh.F_LastConsumeTime = NULL,
  --     kh.F_SleepDays = GREATEST(0, DATEDIFF(CURDATE(), kh.F_CreateTime)),
  --     kh.F_SleepStartTime = CASE
  --         WHEN GREATEST(0, DATEDIFF(CURDATE(), kh.F_CreateTime)) >= 60 AND kh.F_SleepStartTime IS NULL
  --         THEN DATE(kh.F_CreateTime)
  --         WHEN GREATEST(0, DATEDIFF(CURDATE(), kh.F_CreateTime)) < 60
  --         THEN NULL
  --         ELSE kh.F_SleepStartTime
  --     END
  -- WHERE kh.F_IsEffective = 1
  --     AND consume.hy IS NULL;