Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.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_Postgresql - Fatal编程技术网

Python 使用SQL按特定条件删除重复行

Python 使用SQL按特定条件删除重复行,python,sql,postgresql,Python,Sql,Postgresql,我试图删除某些条件下的重复名称: 他们的任务为空,完全忽略具有非空任务的行 删除除最新行以外的所有重复项 SQL并不是最好的,但它是拼凑在一起的 只有一个组合主键,它组合了first_name和另一个随机列。因此,根据我的理解,ctid被用作该行的参考。我对任务为空的重复出现的名称进行分组,然后只选择MAXdate_已启动的每个组中最新的一个。我删除了所有重复的行a.name=b.name,该行满足任务为空的条件a.task为空,但我使用a.ctid b.ctid b.ctid b.ctid作为

我试图删除某些条件下的重复名称:

他们的任务为空,完全忽略具有非空任务的行 删除除最新行以外的所有重复项 SQL并不是最好的,但它是拼凑在一起的

只有一个组合主键,它组合了first_name和另一个随机列。因此,根据我的理解,ctid被用作该行的参考。我对任务为空的重复出现的名称进行分组,然后只选择MAXdate_已启动的每个组中最新的一个。我删除了所有重复的行a.name=b.name,该行满足任务为空的条件a.task为空,但我使用a.ctid b.ctid b.ctid b.ctid作为所选的最新行(截至开始日期)选择的行除外。至少这是我希望做的。它实际上不起作用

DELETE FROM player_assignments a 
USING (SELECT MAX(date_started) as ctid, date_started, name, task 
FROM player_assignments WHERE task IS NULL GROUP BY name HAVING COUNT(*) > 1) b 
WHERE a.name = b.name AND a.ctid <> b.ctid AND a.task IS NULL
通过不同的小调整,我经常会遇到两个特别的错误

psycopg2.errors.GroupingError:列player_assignments.date_started必须出现在GROUP BY子句中,或者在聚合函数中使用 第1行:…正在选择作为ctid启动的MAXdate\u,数据

psycopg2.errors.UndefinedFunction:运算符不存在:带时区的tid时间戳 第1行:…me=name和a.ctid b.ctid

试试这个:

DELETE FROM player_assignments a 
USING (
  SELECT 
    name,
    MAX(date_started) as ctid 
  FROM player_assignments 
  WHERE task IS NULL
  GROUP BY name
  HAVING COUNT(*) > 1
) b 
WHERE a.name = b.name
  AND a.date_started <> b.ctid
  AND a.task IS NULL
试试这个:

DELETE FROM player_assignments a 
USING (
  SELECT 
    name,
    MAX(date_started) as ctid 
  FROM player_assignments 
  WHERE task IS NULL
  GROUP BY name
  HAVING COUNT(*) > 1
) b 
WHERE a.name = b.name
  AND a.date_started <> b.ctid
  AND a.task IS NULL

我想我应该使用相关子查询来实现这一点:

delete from player_assignments pa
    where pa.task is null and
          pa.date_started < (select max(pa2.date_started)
                             from player_assignments pa2
                             where pa2.name = pa.name and
                                   pa2.task is null
                            );

注意:这假设您希望保留一行为null,即使名称中存在其他非null行。如果只想在所有行中最新的行中保留空行,则从子查询中删除pa2.task is NULL。

我想我应该使用相关子查询来实现这一点:

delete from player_assignments pa
    where pa.task is null and
          pa.date_started < (select max(pa2.date_started)
                             from player_assignments pa2
                             where pa2.name = pa.name and
                                   pa2.task is null
                            );
注意:这假设您希望保留一行为null,即使名称中存在其他非null行。如果只希望在所有行中最近的行中保留空行,则从子查询中删除pa2.task is NULL