1

ミリ秒までのタイムスタンプが付けられた行を含むMySQLに非常に大きなテーブルがあります..

日付を含む日付列があります(日付と呼ばれます)

2011-01-13  

時間、分、秒、ミリ秒の時間を含む別の列 (時間と呼ばれる)

01:11:43.381

1 分あたりのレコード数が多すぎるため、1 分あたり 1 つのエントリを保持し、同じ分に他のエントリを削除することは可能ですか? (たとえば、毎分最初のエントリを保持できます)

どうやってやるの ?少し調べてもネット上では見つけられませんでした:(

どうもありがとう !

4

3 に答える 3

1

delete集計で必要なことを行うことができます:

delete bt
    from bigtable bt join
         (select date, min(time) as time
          from bigtable
          group by date, hour(time), minute(time)
         ) btt
         on btt.date = bt.date and
            hour(bt.time) = hour(btt.time) and
            minute(bt.time) = minute(btt.time) and
            bt.time <> btt.mintime;

これが効率的であると約束するつもりはありませんが、希望どおりに動作するはずです。

于 2014-12-01T15:27:14.553 に答える
1

以下の単純な削除ステートメントを使用して、指定した条件を満たす最初の行を除くすべての行を削除できるはずです。

DELETE FROM TABLE1 WHERE ID NOT IN (
        SELECT I FROM (
               SELECT  MIN(PRIMARY_KEY) I, 
                       CONCAT( DATE_FIELD ,' ', SUBSTR(TIME_FIELD, 1, 5)) DT  
               FROM TABLE1 GROUP BY DT) AS X)

基本的に、日付と「分までの時間」を連結し、内部クエリで最小識別子をフィルタリングしてから、選択した最小 ID 以外のすべてを削除しようとしています。

重要な注意: 不要なレコードを複数回挿入しないことが、この問題を解決する最善の方法ですが、質問者は、それは選択肢ではないと述べています。

于 2014-12-01T17:42:29.777 に答える
0

日付と時刻が 2 つの列に分かれていると非常に煩わしいので、やむを得ない技術的な理由がない限り、これは避けたいと思います。

ちょっとした問題に関しては、必要なのは、UNIQUE制約を適用できる列です。最も簡単な方法は、分のシリアル、または 60 で割った秒単位のエポック時間を使用することです。

epoch_minutetypeという名前の列を追加し、それにインデックス制約INTを与えて、UNIQUEその値に相当する値を入力します。INSERT IGNORE次に、またはタイプのトリガーを使用して、INSERT ... ON DUPLICATE KEY1 分あたりの繰り返しを処理できます。これは、1 分ごとに最初のレコードを保持するか、最後のレコードを保持するかによって異なります。

UNIX_TIMESTAMP()関数を使用して古い値を移行できます。

UPDATE table_name SET epoch_minute = UNIX_TIMESTAMP(date_column) / 60

例として、 というテーブルが与えられた場合table_name、一意の列制約を持つ値を受け取る新しいテーブルを準備します。

CREATE TABLE _table_name LIKE table_name;
ALTER TABLE _table_name ADD COLUMN epoch_minute INT;
CREATE UNIQUE INDEX index_table_name_epoch_minute ON _table_name (epoch_minute);

INSERT IGNORE次に、重複をスキップするために使用できます。

INSERT IGNORE INTO _table_name (column_a, column_b, epoch_minute)
  SELECT column_a, column_b, UNIX_TIMESTAMP(date_column) / 60
    FROM table_name;

最後に、テーブルをスワップします。

RENAME TABLE table_name TO table_name_old, _table_name to table_name;
于 2014-12-01T15:09:39.067 に答える