首页 > 解决方案 > 用于按 2 列分组并获取第 3 列的第一次出现的 SQL 查询

问题描述

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

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

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

我希望结果是——

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

所以基本上,删除重复对B, C,并A为那对B, C.

标签: mysqlsql

解决方案


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

mysql 8.0你可以row_number() over (partition by B, C order by A)用来解决这个问题。

CREATE TABLE Table1
  (`A` int, `B` int, `C` int)
;

INSERT INTO Table1
  (`A`, `B`, `C`)
VALUES
  (1, 2, 3),
  (2, 2, 3),
  (2, 5, 6),
  (3, 5, 6)
;
select `A`, `B`, `C` from (
    select *,row_number() over (partition by `B`, `C` order by `A`) rnk from Table1
) T
where rnk = 1;
一个 | 乙| C
-: | -: | -:
 1 | 2 | 3
 2 | 5 | 6

db<>在这里摆弄

如果mysql < 8.0您可以在 MySQL 中遵循此答案ROW_NUMBER()


更新 :

如果像@forpas 说的:taking the first occurrence of A for that pair of B, C is not solved by order by A.

您必须先对 rownum 进行排序:

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

 一个 | 乙| C
-: | -: | -:
 2 | 2 | 3
 2 | 5 | 6

db<>在这里摆弄


推荐阅读