track_report_schema_fix.sql 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. -- Fix track report dimensions:
  2. -- 1. track_links stores platform and typename separately.
  3. -- 2. track_daily_report uniqueness is based on the monitored link + metric scene + account.
  4. SET @sql = (
  5. SELECT IF(
  6. COUNT(*) = 0,
  7. 'ALTER TABLE `track_links` ADD COLUMN `typename` varchar(64) NOT NULL DEFAULT '''' AFTER `platform`',
  8. 'SELECT 1'
  9. )
  10. FROM information_schema.COLUMNS
  11. WHERE TABLE_SCHEMA = DATABASE()
  12. AND TABLE_NAME = 'track_links'
  13. AND COLUMN_NAME = 'typename'
  14. );
  15. PREPARE stmt FROM @sql;
  16. EXECUTE stmt;
  17. DEALLOCATE PREPARE stmt;
  18. SET @sql = (
  19. SELECT IF(
  20. COUNT(*) = 0,
  21. 'ALTER TABLE `track_daily_report` ADD COLUMN `typename` varchar(64) NOT NULL DEFAULT '''' AFTER `platform`',
  22. 'SELECT 1'
  23. )
  24. FROM information_schema.COLUMNS
  25. WHERE TABLE_SCHEMA = DATABASE()
  26. AND TABLE_NAME = 'track_daily_report'
  27. AND COLUMN_NAME = 'typename'
  28. );
  29. PREPARE stmt FROM @sql;
  30. EXECUTE stmt;
  31. DEALLOCATE PREPARE stmt;
  32. SET @sql = (
  33. SELECT IF(
  34. COUNT(*) = 0,
  35. 'ALTER TABLE `track_daily_report` ADD COLUMN `account_id` int NOT NULL DEFAULT 0 AFTER `track_link_id`',
  36. 'SELECT 1'
  37. )
  38. FROM information_schema.COLUMNS
  39. WHERE TABLE_SCHEMA = DATABASE()
  40. AND TABLE_NAME = 'track_daily_report'
  41. AND COLUMN_NAME = 'account_id'
  42. );
  43. PREPARE stmt FROM @sql;
  44. EXECUTE stmt;
  45. DEALLOCATE PREPARE stmt;
  46. SET @sql = (
  47. SELECT IF(
  48. (SELECT COUNT(*)
  49. FROM information_schema.TABLES
  50. WHERE TABLE_SCHEMA = DATABASE()
  51. AND TABLE_NAME = 'track_request_logs') > 0
  52. AND COUNT(*) = 0,
  53. 'ALTER TABLE `track_request_logs` ADD COLUMN `account_id` int NOT NULL DEFAULT 0 AFTER `track_id`',
  54. 'SELECT 1'
  55. )
  56. FROM information_schema.COLUMNS
  57. WHERE TABLE_SCHEMA = DATABASE()
  58. AND TABLE_NAME = 'track_request_logs'
  59. AND COLUMN_NAME = 'account_id'
  60. );
  61. PREPARE stmt FROM @sql;
  62. EXECUTE stmt;
  63. DEALLOCATE PREPARE stmt;
  64. UPDATE `track_links`
  65. SET `typename` = CASE
  66. WHEN `typename` <> '' THEN `typename`
  67. WHEN `platform` IN ('淘宝', '京东', '拼多多', 'tb', 'jd', 'pdd', '1', '9', '13') THEN ''
  68. ELSE `platform`
  69. END;
  70. UPDATE `track_links` SET `platform` = '淘宝' WHERE `id` IN (1, 2);
  71. UPDATE `track_links` SET `platform` = '京东' WHERE `id` IN (19, 20);
  72. UPDATE `track_links` SET `platform` = '拼多多' WHERE `id` IN (21, 22);
  73. SET @sql = (
  74. SELECT IF(
  75. COUNT(*) > 0,
  76. 'ALTER TABLE `track_daily_report` DROP INDEX `uk_track_daily`',
  77. 'SELECT 1'
  78. )
  79. FROM information_schema.STATISTICS
  80. WHERE TABLE_SCHEMA = DATABASE()
  81. AND TABLE_NAME = 'track_daily_report'
  82. AND INDEX_NAME = 'uk_track_daily'
  83. );
  84. PREPARE stmt FROM @sql;
  85. EXECUTE stmt;
  86. DEALLOCATE PREPARE stmt;
  87. UPDATE `track_daily_report` d
  88. JOIN `track_links` l ON d.`track_link_id` = l.`id`
  89. SET d.`platform` = l.`platform`,
  90. d.`typename` = l.`typename`,
  91. d.`scene` = CASE WHEN d.`scene` <> '' THEN d.`scene` ELSE l.`scene` END,
  92. d.`unique_id` = l.`unique_id`;
  93. DROP TEMPORARY TABLE IF EXISTS `tmp_track_daily_keep`;
  94. DROP TEMPORARY TABLE IF EXISTS `tmp_track_daily_merge`;
  95. CREATE TEMPORARY TABLE `tmp_track_daily_keep` AS
  96. SELECT MIN(`id`) AS `id`
  97. FROM `track_daily_report`
  98. GROUP BY `report_date`, `event_type`, `track_link_id`, `scene`, `account_id`;
  99. CREATE TEMPORARY TABLE `tmp_track_daily_merge` AS
  100. SELECT
  101. `report_date`,
  102. `event_type`,
  103. `track_link_id`,
  104. `scene`,
  105. `account_id`,
  106. MAX(`event_count`) AS `event_count`
  107. FROM `track_daily_report`
  108. GROUP BY `report_date`, `event_type`, `track_link_id`, `scene`, `account_id`;
  109. UPDATE `track_daily_report` d
  110. JOIN `tmp_track_daily_merge` m
  111. ON d.`report_date` = m.`report_date`
  112. AND d.`event_type` = m.`event_type`
  113. AND d.`track_link_id` = m.`track_link_id`
  114. AND d.`scene` = m.`scene`
  115. AND d.`account_id` = m.`account_id`
  116. SET d.`event_count` = m.`event_count`
  117. WHERE d.`id` IN (SELECT `id` FROM `tmp_track_daily_keep`);
  118. DELETE d
  119. FROM `track_daily_report` d
  120. LEFT JOIN `tmp_track_daily_keep` k ON d.`id` = k.`id`
  121. WHERE k.`id` IS NULL;
  122. DROP TEMPORARY TABLE `tmp_track_daily_keep`;
  123. DROP TEMPORARY TABLE `tmp_track_daily_merge`;
  124. ALTER TABLE `track_daily_report`
  125. ADD UNIQUE KEY `uk_track_daily` (`report_date`, `event_type`, `track_link_id`, `scene`, `account_id`);
  126. SET @sql = (
  127. SELECT IF(
  128. COUNT(*) = 0,
  129. 'ALTER TABLE `track_daily_report` ADD KEY `idx_track_daily_account` (`report_date`, `account_id`, `track_link_id`)',
  130. 'SELECT 1'
  131. )
  132. FROM information_schema.STATISTICS
  133. WHERE TABLE_SCHEMA = DATABASE()
  134. AND TABLE_NAME = 'track_daily_report'
  135. AND INDEX_NAME = 'idx_track_daily_account'
  136. );
  137. PREPARE stmt FROM @sql;
  138. EXECUTE stmt;
  139. DEALLOCATE PREPARE stmt;