繁体   English   中英

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

[英]Remove duplicates SQL while ignoring key and selecting max of specified column

我有以下示例数据:

| 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   |

我可以对表进行重复数据删除,但是我尝试通过用'@'覆盖字段来将'data_Id'值设置为NULL。

无论如何,在保持“ data_id”的值的同时,在所有字段上选择不重复? 如果可能,我将采用最高或最大的data_id#。

如果只希望返回一行以获取特定值(在本例中为name),则您必须按该值分组。 这似乎是一个好方法,因为您还说过每个名称都需要最大的data_id,所以我建议像这样对MAX()聚合函数进行分组和使用:

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

您唯一需要了解的是,一个名称可能在不同的name_ids下多次出现。 如果在你的表可能的,你可以组由名_ID过,这是我做的。

由于您说过您对key_id并不感兴趣,而只对名称感兴趣,因此我将其完全从查询中排除,以获得此信息:

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

这是SQL Fiddle示例。

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

这将表格按我要重复数据删除的值分组,同时仍保持结构并忽略“ Data_id”列

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM