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

基本的に、最初のルールは、2012年8月10日、2012年7月10日、2012年5月10日、および2012年4月10日の日付をグループ化することです。この2012年8月10日を出発点として使用してください。次に、互いに近い日付をすべて削除します(最低1日)。

ところで...これはオーストラリアの日付(DD / MM / YYYY)です。したがって、結果は2012年8月10日、2012年5月10日です。これらの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 に答える