如何获取表中N个不同资产的全量重复行数据?LIMIT/GROUP BY无效
可行的解决方案
我来给你几个实用的方案,完美解决你要获取20个不同资产全量行的需求,避开直接用LIMIT截断行、GROUP BY聚合数据的问题:
1. 子查询关联法(兼容性最强)
先通过子查询筛选出20个唯一的资产名称,再关联原表拿到这些资产的所有行数据,这种写法几乎适配所有主流数据库:
SELECT t.Name, t.SomeData, t.MoreStuff FROM your_table t INNER JOIN ( -- 这里先取20个不同的资产,可根据需求调整排序规则(比如按创建时间、资产ID等) SELECT DISTINCT Name FROM your_table ORDER BY Name LIMIT 20 ) AS top_assets ON t.Name = top_assets.Name;
2. CTE+窗口函数法(可读性更高)
如果你的数据库支持CTE(公共表表达式)和窗口函数(比如MySQL 8.0+、PostgreSQL、SQL Server等),这种写法逻辑更清晰:
WITH ranked_assets AS ( -- 给每个唯一资产分配一个排名,取前20个 SELECT DISTINCT Name, ROW_NUMBER() OVER (ORDER BY Name) AS asset_rank FROM your_table ) SELECT t.Name, t.SomeData, t.MoreStuff FROM your_table t JOIN ranked_assets ra ON t.Name = ra.Name WHERE ra.asset_rank <= 20;
3. IN子句嵌套法(写法简洁)
用IN子句指定目标资产集合,不过注意部分数据库(比如MySQL)需要嵌套一层子查询来规避语法限制:
SELECT Name, SomeData, MoreStuff FROM your_table WHERE Name IN ( SELECT Name FROM ( SELECT DISTINCT Name FROM your_table ORDER BY Name LIMIT 20 ) AS temp_table );
注意事项
- 所有方案里的
ORDER BY Name可以根据你的实际需求调整,比如换成ORDER BY create_time DESC来取最新的20个资产; - 如果不需要特定顺序,也可以去掉
ORDER BY,但不同数据库可能会返回随机的20个资产,这点要留意。
内容的提问来源于stack exchange,提问作者FranAguiar
相关产品推荐
相关产品推荐

