可能重复:
Delete duplicate rows
这是我的表结构:
“作者”(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模块安装正确,我可以在db上写。
答案 0 :(得分:2)
不幸的是,在SQLite3中你没有像partition over row
那样的好函数,所以在一个查询中没有办法做到这一点,所以你要么必须在程序上或迭代地进行。
出于性能原因,我建议您提取完整的删除潜力列表,然后将其删除,例如。
# in your sql query
SELECT ROWID, AUTHOR, BODY
FROM TABLE_NAME
ORDER BY AUTHOR, BODY, POINTS DESC
然后在你的Python应用程序中,遍历你的结果集,并存储作者/身体组合的所有非第一个ROWID(想想CTRL-BREAK样式编程),一旦你完成构建你的集合删除行ID
答案 1 :(得分: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
注意:一个警告是,如果多个作者/身体对具有相同的最大点值,则将保留所有这些值。
答案 2 :(得分:0)
我还没有测试过,但可以工作:
DELETE FROM TableName
WHERE author, body, points NOT IN (SELECT author, body, MAX(points) as points
FROM TableName
GROUP BY author, body)
首先将其作为SELECT查询运行,看它是否会保留您想要的内容。