按 ID 和更新列对 SQL 中的行进行分组

Group rows in SQL by ID and Update Columns

我有一个 table,包含列 ID、A1、C1、C2...C20、国家、州、名称和其他 10 个类似于国家、州、名称的列(A1 是我的主键)

我现有的 table 看起来像这样

ID A1 C1 C2 C3 C4 Country State      Pet Name
1  25 1  1  0   1 USA     Texas      Tucker
1  26 1  0  0   0 USA     California Drum 
2  27 0  1  1   0 Canada  BC         Golden
2  28 0  0  0   1 USA     Ohio       Charlie
3  29 1  1  0   0 Mexico  Tabasco    Chelsea

我如何实现这个


ID A1 C1 C2 C3 C4 Country State      Pet Name
1  25 1  1  0   1 USA     Texas      Tucker
2  27 0  1  1   1 Canada  BC         Golden
3  29 1  1  0   0 Mexico  Tabasco    Chelsea

我想按 Id 分组,如果任何时候有 1 个记录,我希望它更新为 1,并且我不希望具有相同 ID 的重复信息的行具有不同的 A1。如果有一个像 3 这样只有一个 A1 的 ID,我不希望它有任何变化。一旦我得到这个,Id可以成为我的主键但我希望我可以保留其他列的信息,例如第一次记录的A1对应的国家,州,名称(如输出table所示)。

请告诉我如何完成这项工作,谢谢

我想你想要聚合:

select id, min(a1) a1, max(c1) c1, max(c2) c2, max(c3) c3, max(c4) c4
from mytable
group by id

如果你想处理更多的列,那就不一样了。我会推荐 window max()s 和 row_number():

select *
from (select id, a1,
        max(c1) over(partition by id) c1,
        max(c2) over(partition by id) c2,
        max(c3) over(partition by id) c3,
        max(c4) over(partition by id) c4,
        country,
        state,
        row_number() over(partition by id order by a1) rn
    from mytable
) t
where rn = 1

我想你想要每个 id 的最小值 a1:

select t.*
from (select t.*,
             row_number() over (partition by id order by a1 asc) as seqnum
      from t
     ) t
where seqnum = 1;

或者:

select t.*
from t
where t.a1 = (select min(t2.a1) from t t2 where t2.id = t.id);