我可以在mysql查询中获得聚合字段的唯一值吗?该查询使用GROUPBY作为另一个字段

我可以在mysql查询中获得聚合字段的唯一值吗?该查询使用GROUPBY作为另一个字段,mysql,Mysql,这是一张桌子 id | year 1 2020 2 2020 3 2020 1 2019 2 2019 3 2019 我试图通过一年的小组,我得到的结果是 id | year 1 2020 1 2019 但我需要为id获取不同的值 期望值: id | year 1 2020 2 2019 (或) 我尝试了这个mysql查询 select*from table group by year如果不使用分析函数,这可能很棘手,但如果您使用的是MySQL 8+

这是一张桌子

id | year
1   2020
2   2020
3   2020
1   2019
2   2019
3   2019
我试图通过一年的小组,我得到的结果是

id | year
1   2020
1   2019
但我需要为id获取不同的值

期望值:

id | year
1   2020
2   2019
(或)

我尝试了这个mysql查询


select*from table group by year

如果不使用分析函数,这可能很棘手,但如果您使用的是MySQL 8+,这里有一种方法:

WITH cte AS (
    SELECT id, year, DENSE_RANK() OVER (ORDER BY year) dr,
        ROW_NUMBER() OVER (PARTITION BY year ORDER BY id) rn
    FROM yourTable
)

SELECT id, year
FROM cte
WHERE dr = rn;

为了解释,这里是一个关于完整CTE的查询,没有任何
WHERE
子句:


请注意,每个年度记录块都从1开始编号
dr
,在每个年度记录块中,
rn
列从1开始编号。我们保留行数和密集秩相同的行。

但我需要为id获取不同的值,为什么?这些结果背后的逻辑是什么?制定标准,定义每个年份值必须返回的id值-不带“或”、“可能”等。也就是说,任何人在对相同数据使用此规则时都必须获得相同的结果。@forpas我不希望id在分组后重复超过一年。假设此表是在从其他表进行各种联接之后获得的,因此任何结果都像:
12020、2019年
12020、2019年
2020年,3 2019
可以吗?是的,任何组合都是允许的,直到一个id不被使用超过一年@forpasHey Tim感谢您的贡献,但这对我的情况没有帮助,因为我正在使用mysql 5如果您经常有这样的要求,那么我强烈建议升级到mysql 8+。MySQL5和更早版本的官方支持时间只有这么长。
WITH cte AS (
    SELECT id, year, DENSE_RANK() OVER (ORDER BY year) dr,
        ROW_NUMBER() OVER (PARTITION BY year ORDER BY id) rn
    FROM yourTable
)

SELECT id, year
FROM cte
WHERE dr = rn;