1

私は私のテーブルを持っていますtransfer

| id  | fix | part |       created       |
|  +  |  +  |   +  |          +          |
|  +  |  +  |   +  |          +          |
| 238 |  1  |   1  | 2012-02-10 21:15:48 |
| 239 |  9  |   1  | 2012-02-11 12:36:17 |
| 240 |  1  |   2  | 2012-02-12 23:35:28 |
| 241 |  2  |   1  | 2012-02-13 06:17:35 |
| 242 |  4  |   2  | 2012-02-14 17:45:42 |
| 243 |  1  |   1  | 2012-02-15 20:32:58 |
| 244 |  2  |   2  | 2012-02-16 12:52:19 |
| 245 |  3  |   1  | 2012-02-17 22:35:56 |
| 246 |  1  |   2  | 2012-02-18 09:11:23 |
| 247 |  3  |   1  | 2012-02-19 19:46:44 |
| 248 |  1  |   1  | 2012-02-20 02:30:14 |
| 249 |  2  |   1  | 2012-02-21 13:36:49 |
| 250 |  1  |   3  | 2012-02-22 21:35:34 |
| 251 |  1  |   1  | 2012-02-23 19:25:12 |
| 252 |  1  |   2  | 2012-02-24 18:53:43 |
| 253 |  1  |   3  | 2012-02-25 21:05:28 |
| 254 |  3  |   1  | 2012-02-26 12:33:35 |
| 255 |  1  |   1  | 2012-02-27 18:35:18 |
| 256 |  4  |   1  | 2012-02-28 22:15:27 |
| 257 |  4  |   1  | 2012-03-01 12:22:17 |
| 258 |  2  |   2  | 2012-03-02 10:19:24 |
| 259 |  9  |   1  | 2012-03-03 18:45:46 |
| 260 |  1  |   2  | 2012-03-04 23:19:07 |
| 261 |  2  |   1  | 2012-03-05 09:11:11 |
| 262 |  1  |   1  | 2012-03-06 21:25:29 |
|  +  |  +  |   +  |          +          |
|  +  |  +  |   +  |          +          |
| 901 |  1  |   3  | 2012-04-30 22:15:27 |
| 902 |  3  |   1  | 2012-05-01 12:22:17 |
| 903 |  2  |   1  | 2012-05-02 10:19:24 |
| 904 |  1  |   1  | 2012-05-03 18:45:46 |
|  +  |  +  |   +  |          +          |
|  +  |  +  |   +  |          +          |

そしてcreated、同じ列ごとに最新 ( ) の 3 行を .. の間隔で保持したい、たとえば 3 か月。1行または2行しかない場合は、それらを表示してください! (例として 242 を参照)fixpartid

いくつかのことを試して、stackoverflow で検索しましたが、追加の列 ( ) で解決策が見つかりませんでしたpart

処理後、テーブルtransferは次のようになります。

| id  | fix | part |       created       |
| 904 |  1  |   1  | 2012-05-03 18:45:46 |
| 262 |  1  |   1  | 2012-03-06 21:25:29 |
| 255 |  1  |   1  | 2012-02-27 18:35:18 |
| 260 |  1  |   2  | 2012-03-04 23:19:07 |
| 252 |  1  |   2  | 2012-02-24 18:53:43 |
| 246 |  1  |   2  | 2012-02-18 09:11:23 |
| 901 |  1  |   3  | 2012-04-30 22:15:27 |
| 253 |  1  |   3  | 2012-02-25 21:05:28 |
| 250 |  1  |   3  | 2012-02-22 21:35:34 |
| 903 |  2  |   1  | 2012-05-02 10:19:24 |
| 261 |  2  |   1  | 2012-03-05 09:11:11 |
| 249 |  2  |   1  | 2012-02-21 13:36:49 |
| 258 |  2  |   2  | 2012-03-02 10:19:24 |
| 244 |  2  |   2  | 2012-02-16 12:52:19 |
| 902 |  3  |   1  | 2012-05-01 12:22:17 |
| 254 |  3  |   1  | 2012-02-26 12:33:35 |
| 247 |  3  |   1  | 2012-02-19 19:46:44 |
| 257 |  4  |   1  | 2012-03-01 12:22:17 |
| 256 |  4  |   1  | 2012-02-28 22:15:27 |
| 242 |  4  |   2  | 2012-02-14 17:45:42 |
| 259 |  9  |   1  | 2012-03-03 18:45:46 |
| 239 |  9  |   1  | 2012-02-11 12:36:17 |

理解を深めるために、例fixを注文しました。part

多分誰かが私にヒントを与えることができますか?

4

2 に答える 2

1

次のようなことを試してみてください:

delete from transfer
where id not in (
  select id
  from (
    select id, fix, part, created,
    (select count(*) from transfer where created >= a.created and fix = a.fix and part = a.part) as rank
    from transfer a
  ) as t
  where rank <= 3
);

行をランク付けするために相関サブクエリを使用していますが、これには三角結合に固有のパフォーマンス上の欠陥があります (SQL Server の記事ですが、それでも適用されます)。

ここにSqlFiddle のデモがあります。

于 2013-02-11T18:15:55.530 に答える
1

以下を使用して、削除する ID のリストを取得できます。

select t.*,
       group_concat(id separator ',' order by created desc) as ids
from transfer
where created >= curdate - interval 3 month
group by fix, part

これを次のように削除に変換できます。

delete from t
    where not exists (select 1
                  from (select fix, part,
                               group_concat(id separator ',' order by created desc) as ids
                        from transfer
                        where created >= curdate - interval 3 month
                        group by fix, part
                       ) t1
                  where t.id not in (substring_index(ids, 1), substring_index(ids, 2), substring_index(ids, 3))
                 )

MySQL はサブクエリでの削除に同じテーブルを使用することにうるさいですが、複数レベルのサブクエリでそれを許可します。

于 2013-02-11T18:22:07.757 に答える