0

我在下面的 MySQL 中有这些记录

RecID | Description | Date | Hits | IsPublished 
1; "Test"; 04/10/2012; 45; True
2; "Test 1"; 04/10/2012; 37; True
3; "Test 2"; 05/10/2012; 12; True
4; "Test 3"; 05/10/2012; 13; True
5; "Test 4"; 07/10/2012; 14; True
6; "Test 5"; 07/10/2012; 25; True
7; "Test 4"; 08/10/2012; 23; True
8; "Test 5"; 08/10/2012; 35; True
9; "Test 9"; 12/10/2012; 7; True

想实现以下

9; "Test 9"; 12/10/2012; 7; True 
8; "Test 5"; 08/10/2012; 35; True
4; "Test 3"; 05/10/2012; 13; True

基本上,第一条规则是将日期分组为 08/10/2012、07/10/2012 和 05/10/2012 和 04/10/2012。使用这个 08/10/2012 作为起点。然后删除任何彼此接近的日期(最少 1 天)。

顺便说一句……这是澳大利亚的日期(DD/MM/YYYY)。因此,结果是 08/10/2012、05/10/2012。在这 2 个“有效”天中,然后选择当天点击次数较多的记录。然后将其他设置为 IsPublished = false。

有什么想法可以在 MySQL 中做到这一点吗?

4

1 回答 1

1

首先找到没有其他行的日期大于 1 的日期:

    SELECT DISTINCT t1.Date
    FROM table_name t1
    LEFT JOIN table_name t2
      ON DATE_ADD(t1.Date, INTERVAL 1 DAY) = t2.Date
    WHERE t2.RecId IS NULL

然后找到这些日期的最大点击量:

  SELECT Date, MAX(Hits) as maxHits
  FROM table_name
  WHERE Date IN (
    SELECT DISTINCT t1.Date
    FROM table_name t1
    LEFT JOIN table_name t2
      ON DATE_ADD(t1.Date, INTERVAL 1 DAY) = t2.Date
    WHERE t2.RecId IS NULL )
  GROUP BY Date

最后,更新所有与这些日期和 maxHits 不匹配的行:

UPDATE table_name toUpdate, (    
  SELECT Date, MAX(Hits) as maxHits
  FROM table_name
  WHERE Date IN (
    SELECT DISTINCT t1.Date
    FROM table_name t1
    LEFT JOIN table_name t2
      ON DATE_ADD(t1.Date, INTERVAL 1 DAY) = t2.Date
    WHERE t2.RecId IS NULL )
  GROUP BY Date) source
SET toUpdate.IsPublished = false
WHERE toUpdate.Date != source.Date OR toUpdate.Hits != source.maxHits
于 2012-09-30T01:24:51.903 回答