Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python SQL删除重复行_Python_Sql_Database_Sqlite - Fatal编程技术网

Python SQL删除重复行

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

可能重复:

以下是我的表格结构:

作者varchar | Points integer |正文文本

作者总是一样的,身体也是一样的。同一作者条目将在数据库中以不同的主体多次出现,因此我无法根据作者进行删除。但是,points列并不总是相同的。我希望保留具有最大点值的行

我正在使用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

我也正在提交所有的更改,所以不是这样。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);