在PostgreSQL数据库中,编写SQL语句来找出tb_personnel_synchronization表中job_no字段值重复且出现次数超过两次的记录,并且,请提供一条额外的SQL命令,用于删除这些重复记录,但需要保留每个job_no的最大id值所在的行?
时间: 2024-11-15 20:28:32 浏览: 0
sql-dateformat.rar_DateFormat_datEformat SQL_sql中dateformat_时间格式
在 PostgreSQL 中,你可以使用 `GROUP BY` 和 `HAVING` 子句以及 `COUNT()` 函数来找出 `tb_personnel_synchronization` 表中 `job_no` 字段值重复且出现次数超过两次的记录。然后,可以使用 `ROW_NUMBER()` 或 `WITH TIES` 窗口函数配合 `DELETE` 语句来删除除了最大 id 值外的所有重复项。
首先,找出重复并计数的记录:
```sql
SELECT job_no, COUNT(*) as count
FROM tb_personnel_synchronization
GROUP BY job_no
HAVING COUNT(*) > 2;
```
接下来,如果你想删除这些重复的记录,除了每个 `job_no` 最大的 `id` 对应的记录,可以创建一个临时视图(假设 `id` 是主键),然后删除多余的行:
```sql
CREATE TEMPORARY VIEW temp_view AS
SELECT job_no, MAX(id) as max_id
FROM tb_personnel_synchronization
GROUP BY job_no;
DELETE FROM tb_personnel_synchronization t
WHERE NOT EXISTS (
SELECT 1
FROM temp_view tv
WHERE tv.job_no = t.job_no AND t.id = tv.max_id
);
```
这条 SQL 会保留每个 `job_no` 的最大 `id` 所在的记录,并删除其他所有重复的行。
阅读全文