Python SQL删除重复行
可能重复: 以下是我的表格结构: 作者varchar | Points integer |正文文本 作者总是一样的,身体也是一样的。同一作者条目将在数据库中以不同的主体多次出现,因此我无法根据作者进行删除。但是,points列并不总是相同的。我希望保留具有最大点值的行 我正在使用SQLite3和Python 谢谢 编辑: 我已经试过了,但它只是删除了所有的行Python SQL删除重复行,python,sql,database,sqlite,Python,Sql,Database,Sqlite,可能重复: 以下是我的表格结构: 作者varchar | Points integer |正文文本 作者总是一样的,身体也是一样的。同一作者条目将在数据库中以不同的主体多次出现,因此我无法根据作者进行删除。但是,points列并不总是相同的。我希望保留具有最大点值的行 我正在使用SQLite3和Python 谢谢 编辑: 我已经试过了,但它只是删除了所有的行 for row in cur.fetchall(): rows = cur.execute('SELECT * FROM
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
我也正在提交所有的更改,所以不是这样。SQLite3模块安装正确,我可以在db上写入。不幸的是,在SQLite3中,您没有很好的函数,例如行上分区,因此无法在一个查询中完成,因此您必须以过程或迭代的方式完成 出于性能原因,我建议您提取完整的删除潜力列表,然后将其全部删除,例如
# in your sql query
SELECT ROWID, AUTHOR, BODY
FROM TABLE_NAME
ORDER BY AUTHOR, BODY, POINTS DESC
然后在Python应用程序中,迭代结果集,并为Author/Body组合think CTRL-BREAK样式编程存储所有非第一行ID,一旦构建完集合,就删除行ID。我还没有测试它,但这可能会起作用:
首先将其作为SELECT查询运行,以查看它是否会保留您想要的内容。由于您希望删除除最高点以外的所有值,以下操作将很好地完成:
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在此:
注意:一个警告是,如果多个作者/正文对具有相同的最大点值,则所有这些值都将保留。Beep-Beep欢迎回到堆栈溢出,友好的用户。请确保所有问题都以问题的形式表达。此外,请保持礼貌,并记住接受您的问题的答案。祝你有美好的一天。你试过什么?重复的行删除通常是通过某种排序函数来完成的,比如ROWNUMBER,在作者和正文上进行分区。尝试这样做:,尤其是Vivek的答案。当然,您需要切换不等式的方向以获得最大的点值。除非points列是唯一的,否则这将不起作用。您可以从内部选择返回author、body、maxpoints,并且在where子句中,在[inner select]中有author、body、points,这可能会起作用。谢谢,我根据您的建议更新了示例。我还通过声明b/c将主体添加到组中,我认为这是必要的。啊,是的,您需要在组中添加主体,否则它将失败。错过了那个一个。对于这种类型的删除,您不需要在行上设置分区,因为有一个不同点的列。只有在行完全相同的情况下才需要它,而不是完全相同。我很难相信提取数据,用Python处理数据,然后将结果推回到数据库,而不仅仅是在数据库中进行,这样会更有效率。
DELETE FROM TableName
WHERE author, body, points NOT IN (SELECT author, body, MAX(points) as points
FROM TableName
GROUP BY author, body)
delete from test
where exists (select * from test t2
where test.author = t2.author
and test.body = t2.body
and test.points < t2.points);