Python 使用SQL按特定条件删除重复行
我试图删除某些条件下的重复名称: 他们的任务为空,完全忽略具有非空任务的行 删除除最新行以外的所有重复项 SQL并不是最好的,但它是拼凑在一起的 只有一个组合主键,它组合了first_name和另一个随机列。因此,根据我的理解,ctid被用作该行的参考。我对任务为空的重复出现的名称进行分组,然后只选择MAXdate_已启动的每个组中最新的一个。我删除了所有重复的行a.name=b.name,该行满足任务为空的条件a.task为空,但我使用a.ctid b.ctid b.ctid b.ctid作为所选的最新行(截至开始日期)选择的行除外。至少这是我希望做的。它实际上不起作用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作为
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