0

我正在处理的表有多行,它们的lat和具有相同的值lon。该示例显示1, 3,5具有相同的位置,但name属性不同。是由hash构建的namelat因此lon不同。

BEFORE:

 id | name | lat | lon | flag | hash
----+------+-----+-----+------+------
 1  | aaa  | 16  | 48  |  0   | 2cd       <-- duplicate
 2  | bbb  | 10  | 22  |  0   | 3fc
 3  | ccc  | 16  | 48  |  0   | 8ba       <-- duplicate
 4  | ddd  | 10  | 23  |  0   | c33
 5  | eee  | 16  | 48  |  0   | 751       <-- duplicate

我需要识别此表中的“重复项”,并希望将标志1主要)分配给其中一个,将标志2次要)分配给其他人。哪个“重复”被标记为主要并不重要。

 AFTER:

 id | name | lat | lon | flag | hash
----+------+-----+-----+------+------
 1  | aaa  | 16  | 48  |  1   | 2cd       <-- updated
 2  | bbb  | 10  | 22  |  0   | 3fc
 3  | ccc  | 16  | 48  |  2   | 8ba       <-- updated
 4  | ddd  | 10  | 23  |  0   | c33
 5  | eee  | 16  | 48  |  2   | 751       <-- updated

我开始尝试INNER JOIN 受这篇文章和这个视觉描述的启发。有了这个,我可以为所有重复项分配相同的标志。

UPDATE table t1
INNER JOIN table_name t2
ON
  t1.lat = t2.lat
  AND t1.lon = t2.lon
  AND t1.hash != t2.hash
SET
  t1.flag = 2;

我还测试了当只有两行时可以LEFT OUTER JOIN使用哪个。WHERE t2.id IS NULL但是,我无法想象 aJOIN应该如何处理两个以上的重复项。Mark Harrison在他的帖子开头还假设“您正在加入没有重复的列” ,这听起来好像不是一个好主意。

如果感兴趣,我正在使用 MySQL。

4

3 回答 3

2

不确定这是否非常有效,但它只适用于一个查询

UPDATE t
JOIN (
  SELECT MAX(t.id) AS maxid, lat, lon
  FROM t
  JOIN t AS duplicates
  USING (lat, lon)
  GROUP BY lat, lon
  HAVING COUNT(*) > 1
) AS maxima USING (lat, lon)
SET flag = IF(id = maxid, 1, 2);
于 2013-08-09T13:24:12.600 回答
0

假设您希望所有规范记录都有一个flag=1(而不仅仅是那些有重复的记录),您可以这样做:

UPDATE table t1
SET t1.flag = 1
WHERE t1.id in (
    SELECT min(id)
    FROM table t2
    WHERE t1.lat = t2.lat
    AND t1.lon = t2.lon
);

UPDATE table
SET flag = 2
WHERE flag is null;

COMMIT;
于 2013-08-08T23:42:53.800 回答
0

您可以分两步执行此操作:

update table t1 set flag = 2 where id in 
   (select a.id
    from 
        t1 a
        join t1 b on (b.lon = a.lon and b.lat = a.lat));

update table t1 set flag = 1 where id in 
   (select a.id 
    from t1 a
    where a.flag = 2 and a.id = 
        (select min(b.id) from t1 b where b.lon = a.lon and b.lat = a.lat)
   );

这应该被用作灵感而不是福音(这可能是错误的):)

于 2013-08-08T23:44:07.557 回答