corrected_retention_query.sql 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. WITH
  2. -- 为每个设备确定主要国家(基于最早的注册活动)
  3. device_primary_country AS (
  4. SELECT
  5. DeviceId,
  6. RegisterDate,
  7. min_by(Country, RequestTime) as primary_country
  8. FROM user_days_ads
  9. WHERE RegisterDate BETWEEN '2025-08-13' AND '2025-09-11' AND ProductCode != ''
  10. GROUP BY DeviceId, RegisterDate
  11. ),
  12. -- 预先计算每个设备的留存状态,避免重复计算
  13. retention_data AS (
  14. SELECT
  15. DeviceId,
  16. RegisterDate,
  17. MAX(IF(DATEDIFF(BjRequestDate, RegisterDate) = 1, 1, 0)) as day1_retained,
  18. MAX(IF(DATEDIFF(BjRequestDate, RegisterDate) = 2, 1, 0)) as day2_retained,
  19. MAX(IF(DATEDIFF(BjRequestDate, RegisterDate) = 3, 1, 0)) as day3_retained,
  20. MAX(IF(DATEDIFF(BjRequestDate, RegisterDate) = 4, 1, 0)) as day4_retained,
  21. MAX(IF(DATEDIFF(BjRequestDate, RegisterDate) = 5, 1, 0)) as day5_retained,
  22. MAX(IF(DATEDIFF(BjRequestDate, RegisterDate) = 6, 1, 0)) as day6_retained,
  23. MAX(IF(DATEDIFF(BjRequestDate, RegisterDate) = 7, 1, 0)) as day7_retained,
  24. MAX(IF(DATEDIFF(BjRequestDate, RegisterDate) = 8, 1, 0)) as day8_retained
  25. FROM user_days_ads
  26. WHERE RegisterDate BETWEEN '2025-09-10' AND '2025-09-10' AND ProductCode != ''
  27. GROUP BY DeviceId, RegisterDate
  28. ),
  29. -- 基于主要国家统计特定国家数据
  30. country_stats AS (
  31. SELECT
  32. dpc.RegisterDate as date,
  33. dpc.primary_country as title,
  34. CONCAT_WS(',',
  35. CAST(COUNT(DISTINCT(dpc.DeviceId)) AS STRING),
  36. CAST(SUM(rd.day1_retained) AS STRING),
  37. CAST(SUM(rd.day2_retained) AS STRING),
  38. CAST(SUM(rd.day3_retained) AS STRING),
  39. CAST(SUM(rd.day4_retained) AS STRING),
  40. CAST(SUM(rd.day5_retained) AS STRING),
  41. CAST(SUM(rd.day6_retained) AS STRING),
  42. CAST(SUM(rd.day7_retained) AS STRING),
  43. CAST(SUM(rd.day8_retained) AS STRING)
  44. ) as days_str
  45. FROM device_primary_country dpc
  46. LEFT JOIN retention_data rd ON dpc.DeviceId = rd.DeviceId AND dpc.RegisterDate = rd.RegisterDate
  47. WHERE dpc.RegisterDate BETWEEN '2025-09-10' AND '2025-09-10'
  48. AND dpc.primary_country IN ('mm','ir','us')
  49. GROUP BY dpc.RegisterDate, dpc.primary_country
  50. ),
  51. -- 总计数据(每个设备只计算一次)
  52. total_stats AS (
  53. SELECT
  54. dpc.RegisterDate as date,
  55. 'total' as title,
  56. CONCAT_WS(',',
  57. CAST(COUNT(DISTINCT(dpc.DeviceId)) AS STRING),
  58. CAST(SUM(rd.day1_retained) AS STRING),
  59. CAST(SUM(rd.day2_retained) AS STRING),
  60. CAST(SUM(rd.day3_retained) AS STRING),
  61. CAST(SUM(rd.day4_retained) AS STRING),
  62. CAST(SUM(rd.day5_retained) AS STRING),
  63. CAST(SUM(rd.day6_retained) AS STRING),
  64. CAST(SUM(rd.day7_retained) AS STRING),
  65. CAST(SUM(rd.day8_retained) AS STRING)
  66. ) as days_str
  67. FROM device_primary_country dpc
  68. LEFT JOIN retention_data rd ON dpc.DeviceId = rd.DeviceId AND dpc.RegisterDate = rd.RegisterDate
  69. WHERE dpc.RegisterDate BETWEEN '2025-09-10' AND '2025-09-10'
  70. GROUP BY dpc.RegisterDate
  71. )
  72. -- 合并国家数据和总计数据
  73. SELECT * FROM country_stats
  74. UNION ALL
  75. SELECT * FROM total_stats
  76. ORDER BY
  77. date,
  78. CASE
  79. WHEN title = 'total' THEN 1
  80. ELSE 2
  81. END,
  82. title;