2

重複の可能性:
重複する行を削除する

これが私のテーブル構造です:

"作成者" (varchar) | "ポイント" (整数) | "本文)

著者は常に同じであり、ボディも同じです。同じ著者のエントリがデータベース全体に複数回出現し、本文が異なるため、著者ごとに削除することはできません。ただし、ポイント列は常に同じではありません。ポイント値が最大の行を保持したい。

SQLite3 と Python を使用しています。

ありがとう

編集:

私はこれを試しましたが、すべての行を削除するだけです。

for row in cur.fetchall():
        rows = cur.execute('SELECT * FROM Posts WHERE Author=? AND Body=? AND Nested=? AND Found=?', (row['Author'], row['Body'], row['Nested'], row['Found'],))
        for row2 in rows:
            delrow = row
            if (row['Upvotes'] <  row2['Upvotes'] or row['Downvotes'] < row2['Downvotes']):
                delrow = row2
            cur.execute("DELETE FROM Posts WHERE Author=? AND Body=? AND Upvotes=? AND Downvotes=? AND Nested=? AND Found=?", (delrow['Author'], delrow['Body'], delrow['Upvotes'], delrow['Downvotes'], delrow['Nested'], delrow['Found'],))
            dn += 1
            print "Deleted row ", dn

私もこれを試しましたが、うまくいきませんでした。

cur.execute("DELETE FROM Posts WHERE Upvotes NOT IN (SELECT MAX(Upvotes) FROM Posts GROUP BY Body);")

私もすべての変更をコミットしているので、そうではありません。SQLite3 モジュールは正しくインストールされており、データベースに書き込むことができます。

4

3 に答える 3

2

残念ながら、SQLite3 にはこのような優れた関数がないpartition over rowため、1 つのクエリで実行する方法がないため、手続き的または反復的に実行する必要があります。

パフォーマンス上の理由から、削除の可能性のある完全なリストを抽出してから、まとめて削除することをお勧めします。

# in your sql query
SELECT ROWID, AUTHOR, BODY
FROM   TABLE_NAME
ORDER BY AUTHOR, BODY, POINTS DESC

次に、Python アプリケーションで結果セットを反復処理し、Author/Body コンボの最初以外のすべての ROWID を格納し (CTRL-BREAK スタイルのプログラミングを考えてください)、セットの構築が完了したら行 ID を削除します。

于 2012-06-21T20:12:27.473 に答える
1

最高のポイント値以外をすべて削除したいので、次のようにすれば問題ありません。

delete from test
  where exists (select * from test t2
                where test.author = t2.author
                and test.body = t2.body
                and test.points < t2.points);

これは、それ自体への基本的な結合であり、作成者と本文が同じでポイント値が低いすべての値を削除します。

SqlFiddle はこちら: http://sqlfiddle.com/#!7/64d62/3

注: 1 つの注意点として、複数の著者/本文のペアが同じ最大ポイント値を持つ場合、それらの値はすべて保持されます。

于 2012-06-21T20:31:26.460 に答える
0

私はそれをテストしていませんが、これはうまくいくかもしれません:

DELETE FROM TableName
    WHERE author, body, points NOT IN (SELECT author, body, MAX(points) as points
        FROM TableName 
    GROUP BY author, body)

最初にSELECTクエリとして実行して、必要なものが保持されるかどうかを確認します。

于 2012-06-21T20:17:25.880 に答える