删除重复的SQL,同时忽略键并选择指定列的最大值

时间:2014-12-08 22:49:58

标签: mysql distinct deduplication

我有以下示例数据:

| key_id | name  | name_id | data_id |
+--------+-------+---------+---------+
|   1    | jim   |   23    |   098   |
|   2    | joe   |   24    |   098   |
|   3    | john  |   25    |   098   |
|   4    | jack  |   26    |   098   |
|   5    | jim   |   23    |   091   |
|   6    | jim   |   23    |   090   |

我试过这个问题:

INSERT INTO temp_table
SELECT
DISTINCT @key_id,
name,
name_id,
@data_id FROM table1,

我正在尝试连续删除所有字段的表格。

我想要的输出:

| key_id | name  | name_id | data_id |
+--------+-------+---------+---------+
|   1    | jim   |   23    |   098   |
|   2    | joe   |   24    |   098   |
|   3    | john  |   25    |   098   |
|   4    | jack  |   26    |   098   |

我真正得到的是:

| key_id | name  | name_id | data_id  |
+--------+-------+---------+----------+
|   1    | jim   |   23    |   NULL   |
|   2    | joe   |   24    |   NULL   |
|   3    | john  |   25    |   NULL   |
|   4    | jack  |   26    |   NULL   |

我可以重复删除表格,但我正在设置数据_Id'尝试使用' @'

覆盖字段,将值设置为NULL

无论如何,在所有字段上选择不同并且同时保持' data_id'?如果可能的话,我将采用最高或MAX data_id#。

2 个答案:

答案 0 :(得分:0)

如果您只想为特定值(在本例中为name)返回一行,则您拥有的一个选项是按该值进行分组。这似乎是一个很好的方法,因为你还说你想要每个名称最大的data_id,所以我建议分组并使用MAX()聚合函数,如下所示:

SELECT name, name_id, MAX(data_id) AS data_id
FROM myTable
GROUP BY name, name_id;

您唯一应该注意的是名称在不同的name_ids下多次出现的可能性。如果你的表中 是可能的,那么你也可以通过name_id进行分组,这就是我所做的。

既然你说你对key_id不感兴趣而只对名字感兴趣,我只是将它从查询中完全排除在外:

| name  | name_id | data_id |
+-------+---------+---------+
| jim   |   23    |   098   |
| joe   |   24    |   098   |
| john  |   25    |   098   |
| jack  |   26    |   098   |

以下是SQL Fiddle示例。

答案 1 :(得分:0)

RENAME TABLE myTable to Old_mytable,
myTable2 to myTable
INSERT INTO myTable
SELECT *
FROM Old_myTable
GROUP BY name, name_id;

这会按照我想重复数据删除的值对表格进行分组,同时仍保留结构并忽略“Data_id”列