如何使用SQL将文本附加到数据库中的重复项
我如何才能找到重复项并在重复项中附加一个随机数,这样它们就不再是重复项了 样本表:如何使用SQL将文本附加到数据库中的重复项,sql,postgresql,Sql,Postgresql,我如何才能找到重复项并在重复项中附加一个随机数,这样它们就不再是重复项了 样本表: primary_id, student_id, student_name 1 80 John Terry 2 81 Didier Drogba 3 80 John Terry 4 82 Frank Lampard 5 80 J
primary_id, student_id, student_name
1 80 John Terry
2 81 Didier Drogba
3 80 John Terry
4 82 Frank Lampard
5 80 John Terry
我想通过在重复项的名称后面附加一个随机数来消除重复项。例如,在上述场景中,我想重命名
出现在第3行至第112233行和第5行至第668877行的学生姓名。请注意,副本的第一个条目保持不变。在这种情况下,第1行保持不变
重命名的格式为:6位随机数+重复+现有学生姓名
到目前为止,我可以使用下面的SQL获取副本:
SELECT student_id, student_name FROM (select student_id, student_name, count(*) from student
group by student_id, student_name
HAVING count(*) > 1 order by count DESC) AS duplicates
我知道我也可以使用SQL生成一个随机数,但我不知道如何将它附加到重复的条目中
我正在运行Postgresql数据库首先使用窗口函数而不是组方法获取重复的行,例如
SELECT
primary_id, student_id, student_name
FROM
(
SELECT
row_number() OVER (PARTITION BY student_id, student_name) AS dup_no,
primary_id, student_id, student_name
FROM students
) dup
WHERE dup.dup_no > 1;
然后将其与更新相结合。。。从更新到仅更新重复项:
UPDATE students
SET student_name = to_char(dupstudents.dup_no, '000000') || '_DUP_' || students.student_name
FROM (
SELECT
row_number() OVER (PARTITION BY student_id, student_name) AS dup_no,
primary_id, student_id, student_name
FROM students
) dupstudents
WHERE students.primary_id = dupstudents.primary_id
AND dupstudents.dup_no > 1;
e、 g
我没有为随机ID位而烦恼;我只是使用了重复的偏移位置。可以用对random*10^6::integer或其他对象的适当调用来替换它,但要注意随机值冲突。首先使用窗口函数而不是您的组方法获取重复的行,例如
SELECT
primary_id, student_id, student_name
FROM
(
SELECT
row_number() OVER (PARTITION BY student_id, student_name) AS dup_no,
primary_id, student_id, student_name
FROM students
) dup
WHERE dup.dup_no > 1;
然后将其与更新相结合。。。从更新到仅更新重复项:
UPDATE students
SET student_name = to_char(dupstudents.dup_no, '000000') || '_DUP_' || students.student_name
FROM (
SELECT
row_number() OVER (PARTITION BY student_id, student_name) AS dup_no,
primary_id, student_id, student_name
FROM students
) dupstudents
WHERE students.primary_id = dupstudents.primary_id
AND dupstudents.dup_no > 1;
e、 g
我没有为随机ID位而烦恼;我只是使用了重复的偏移位置。可以用对random*10^6::integer或其他任何函数的适当调用来替换它,但要小心随机值冲突。尝试以下方法:
select student_id, R_N, student_name,
CASE WHEN R_N <> 1 THEN to_char( r_n,'000000')||'_DUP_' ELSE '' END ||student_name
FROM (SELECT *,
row_number() OVER ( PARTITION BY student_id ORDER BY student_name) as R_N from student) AS T1
测试者
使用随机数:
select student_id, R_N, student_name,
CASE WHEN R_N <> 1 THEN to_char(random()*1000000,'000000')||'_DUP_' ELSE '' END ||student_name
FROM (SELECT *,
row_number() OVER ( PARTITION BY student_id ORDER BY student_name) as R_N from student) AS T1
在一条不带子查询的语句中:
select student_id,
row_number() OVER ( PARTITION BY student_id ORDER BY student_name) ,
student_name,
CASE WHEN row_number() OVER ( PARTITION BY student_id ORDER BY student_name) <> 1
THEN to_char( random()*1000000,'000000')||'_DUP_' ELSE '' END ||student_name
from student
;
试试这个:
select student_id, R_N, student_name,
CASE WHEN R_N <> 1 THEN to_char( r_n,'000000')||'_DUP_' ELSE '' END ||student_name
FROM (SELECT *,
row_number() OVER ( PARTITION BY student_id ORDER BY student_name) as R_N from student) AS T1
测试者
使用随机数:
select student_id, R_N, student_name,
CASE WHEN R_N <> 1 THEN to_char(random()*1000000,'000000')||'_DUP_' ELSE '' END ||student_name
FROM (SELECT *,
row_number() OVER ( PARTITION BY student_id ORDER BY student_name) as R_N from student) AS T1
在一条不带子查询的语句中:
select student_id,
row_number() OVER ( PARTITION BY student_id ORDER BY student_name) ,
student_name,
CASE WHEN row_number() OVER ( PARTITION BY student_id ORDER BY student_name) <> 1
THEN to_char( random()*1000000,'000000')||'_DUP_' ELSE '' END ||student_name
from student
;
跟进
跟进
请出示您的预期结果。如果dup行具有相同的学生ID和名称,为什么不删除重复的行?您的数据为SQLFIDLE:。“请在将来提供此信息,这样可以节省时间和挫折感。”CraigRinger商业案例要求我保留所有数据。无法删除-无论如何现在不能删除。我确实有一列is_deleted,它是布尔值,我已经标记为True,但数据必须保留。哦,谢谢你的sqlfiddle链接。我不知道这样的服务,请显示您的预期结果。如果dup行具有相同的学生ID和名称,为什么不删除重复的行?您的数据为SQLFIDLE:。“请在将来提供此信息,这样可以节省时间和挫折感。”CraigRinger商业案例要求我保留所有数据。无法删除-无论如何现在不能删除。我确实有一列is_deleted,它是布尔值,我已经标记为True,但数据必须保留。哦,谢谢你的sqlfiddle链接。我不知道这样一个服务你的代码可以工作,但我不知道在哪里插入更新语句,它会像@craig Ringer那样实际更新学生的名字你的代码可以工作,但我不知道在哪里插入更新语句,它会像@craig Ringer那样实际更新学生的名字