0

私はこれを見つけるために何時間も探していました、そして多くのバリエーションがありますが、私は私の特定の要件でループを完全に閉じることができないようです....私がそれを持っていると思うたびにそれは私から滑り落ちます:)

だからここにあります。

一連のレコードをテーブルにインポートしました。最終的には一意の行がありますが、特定の列に重複するデータがあります。 レコードを2つのテーブルに分割したいと思います。1つは「コード」グループ内に最新のタイムスタンプを持つDISTINCTまたはUNIQUE「コード」レコードを含むテーブルで、もう1つは残りのレコードを含むテーブルです。

[編集-心からお詫び申し上げます。最初ははっきりと明確に表現できなかったので、言い換える必要があります。実際、非常に間違っていました...ごめんなさい!]

一意のROWSのみを持つ複数の列があります-(つまり、各列には重複データがありますが、特定の行のすべての列の組み合わせは一意です-明らかに主キーを除きます)

必要なのは、特定のarea_id内のコードの最新のタイムスタンプを含む行です。 以下の例では、これら3つをキーと見なしているため、他の列を除外しています。

TABLE#1
        code    area_id   timestamp    
         1        2      2010-02-31 00:00:00
         2        2      2012-01-31 00:00:00
         2        2      2011-02-31 00:00:00
         1        5      2010-02-31 00:00:00
         2        5      2010-02-31 00:00:00
         1        2      2011-01-31 00:00:00
         1        5      2012-01-31 00:00:00

つまり、私が言いたい答えの構造は次のとおりです。

「コード1とarea_id2の組み合わせの場合、最新のタイムスタンプは2011-01-3100 :00:00です -その行を返します。

codeとarea_idの組み合わせごとに繰り返します。

それで;

RESULT
        code    area_id   timestamp    
         1        2      2011-01-31 00:00:00
         2        2      2012-01-31 00:00:00
         1        5      2012-01-31 00:00:00
         2        5      2010-02-31 00:00:00

前述したように、行を分割するときにデータを含める必要のある列は他にもたくさんありますが、後で心配する必要があると思います。最初のステップは、mysql/を使用せずに結果セットのデータを取得することです。ワークベンチがタイムアウトしました。

JS

4

1 に答える 1

0

そしてこれはtable2用です

INSERT INTO Table2
SELECT *
FROM Table1
WHERE (code, timestamp) NOT IN (SELECT code, MAX(timestamp)
                                FROM Table1
                                GROUP BY code)

次に、これを使用してTable1からレコードを削除します。

DELETE FROM Table1
WHERE (code, timestamp) NOT IN (SELECT * FROM (SELECT code, MAX(timestamp)
                                FROM yourtable
                                GROUP BY code) s)

こちらのフィドルをご覧ください(2月31日から28日、4月31日から30日に変更しました。タイプミスだったと思います)。

編集

これらのクエリは実行が遅すぎるため、JOINバージョンを試すことができます。

INSERT INTO Table2
SELECT t1.*
FROM Table1 t1 LEFT JOIN (SELECT code, MAX(timestamp) max_timestamp
                          FROM Table1
                          GROUP BY code) t2
     ON t1.code=t2.code and t1.timestamp=t2.max_timestamp
WHERE
  t2.code IS NULL;

DELETE t1
FROM Table1 t1 LEFT JOIN (SELECT code, MAX(timestamp) max_timestamp
                           FROM Table1
                           GROUP BY code) t2
     ON t1.code=t2.code and t1.timestamp=t2.max_timestamp
WHERE
  t2.code IS NULL;

こちらのフィドルをご覧ください。

また、次のインデックスの1つ以上を追加してみることができます。

CREATE INDEX idx1 ON Table1 (code)
CREATE INDEX idx2 ON Table1 (timestamp)
CREATE INDEX idx3 ON Table1 (code,timestamp)
于 2013-03-26T21:42:38.990 に答える