Mysql 按2列分组并取第3列的第一个匹配项的SQL查询

Mysql 按2列分组并取第3列的第一个匹配项的SQL查询,mysql,sql,Mysql,Sql,我不擅长SQL查询,所以我想在这里问一下。我有一张桌子我的桌子: 注意:将所有列视为字符串。为了更好地理解,我只是将它们表示为数字 我希望结果是- A B C ----- 1 2 3 2 5 6 因此,基本上,删除B,C的重复对,并为该对B,C取A的第一个匹配项。首先,您最好在这里发布一些您尝试过的内容 在mysql 8.0中,您可以使用按B分区的行数,按A分区的C顺序来解决这个问题 dbfiddle首先,您最好在这里发布一些您尝试过的东西 在mysql 8.0中,您可以使用按B分区的行数,按

我不擅长SQL查询,所以我想在这里问一下。我有一张桌子我的桌子:

注意:将所有列视为字符串。为了更好地理解,我只是将它们表示为数字

我希望结果是-

A B C
-----
1 2 3
2 5 6

因此,基本上,删除B,C的重复对,并为该对B,C取A的第一个匹配项。

首先,您最好在这里发布一些您尝试过的内容

在mysql 8.0中,您可以使用按B分区的行数,按A分区的C顺序来解决这个问题


dbfiddle

首先,您最好在这里发布一些您尝试过的东西

在mysql 8.0中,您可以使用按B分区的行数,按A分区的C顺序来解决这个问题


dbfiddle

您似乎想要聚合:

select min(a) as a, b, c
from t
group by b, c;

我假设第一个是a的最小值。SQL表表示无序集,因此这似乎是最合理的解释。

您似乎想要聚合:

select min(a) as a, b, c
from t
group by b, c;

我假设第一个是a的最小值。SQL表表示无序集合,所以这似乎是最合理的解释。

看来,您需要考虑列A的最小值和B和C的分组:

“强制转换为无符号”转换用于使它们成为数字


似乎需要考虑列A的最小值和B和C的分组:

“强制转换为无符号”转换用于使它们成为数字

根据您的要求,这将获得B和C组合的最小值A


根据您的要求,对于B和C的组合,这将获得A的最小值。

欢迎使用StackOverflow!不要犹豫,通过或在中查看,以确定如何提问。问一些像我想做xyz这样的问题,但不包括代码尝试或关于错误的信息,样本数据和期望的结果可能会因为缺少回答信息而关闭。请记住将所有相关代码、错误日志和问题中的所有内容添加为纯文本,以便我们提供更好的帮助:是否也有类似id的列?是否有排序规则?@forpas no othercolumn@BarbarosÖzhan没有排序规则,您可以按照自己的意愿排序最终结果!不要犹豫,通过或在中查看,以确定如何提问。问一些像我想做xyz这样的问题,但不包括代码尝试或关于错误的信息,样本数据和期望的结果可能会因为缺少回答信息而关闭。请记住将所有相关代码、错误日志和问题中的所有内容添加为纯文本,以便我们提供更好的帮助:是否也有类似id的列?是否有排序规则?@forpas no othercolumn@BarbarosÖzhan没有排序规则,您可以对最终结果进行排序,但是您希望为该对B添加A的第一个匹配项,C不是按A的顺序解决的。为该对B添加A的第一个匹配项,如果你没有读我的笔记,我很抱歉。所有列都是stringlocking,对于这对B,A的第一次出现,C不是minAwell解决的,请使用cast as unsigned then@kevI,如果您没有阅读我的注释,我很抱歉。所有列均为stringlocking,表示该对B的第一次出现A,C未由minAwell解决,使用cast as unsigned then@kev表示该对B的第一次出现A,C未由minA解决表示该对B的第一次出现A,C未由minA解决
select `A`, `B`, `C` from (
    select *,row_number() over (partition by `B`, `C` order by `A`) rnk from Table1
) T
where rnk = 1;
A | B | C -: | -: | -: 1 | 2 | 3 2 | 5 | 6
CREATE TABLE Table1
  (`A` int, `B` int, `C` int)
;

INSERT INTO Table1
  (`A`, `B`, `C`)
VALUES
  (2, 2, 3),
  (1, 2, 3),
  (2, 5, 6),
  (3, 5, 6)
;
SET @rownum:=0;

select `A`, `B`, `C` from (
    select *,row_number() over (partition by `B`, `C` order by rownum) rnk from (
        select *,@rownum:=@rownum+1 AS rownum from Table1
    ) T
) T
where rnk = 1;
✓ A | B | C -: | -: | -: 2 | 2 | 3 2 | 5 | 6
select min(a) as a, b, c
from t
group by b, c;
select min(cast(A as unsigned)) as A, cast(B as unsigned) as B, cast(C as unsigned) as C
  from my_table
 group by B , C 
select min(A) as A,B,C 
from Table1
group by B,C