按 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);
我有一个 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);