我可以在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;