Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.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
如何使用SQL将文本附加到数据库中的重复项_Sql_Postgresql - Fatal编程技术网

如何使用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那样实际更新学生的名字