如何获取每个类别的前n条记录
我来这里是为了根据类别获取记录。
我的表 foo 有字段 [id, name, class]。我的记录可以是这样的:
1, ram, 10
2, hari, 9
3, sita, 10
4, gita, 9
5, rita, 5
6, tina, 7
8, nita, 8
9, bita, 5
10,seta, 7
...以及更多...
现在我想获得来自不同类别的每条记录的结果..即类似于
1, ram, 10
2, hari, 9
5, rita, 5
6, tina, 7
8, nita, 8
每个类别的前 1 记录
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
对于 SQL Server 2005+ 和 Oracle 9i+,使用分析函数:
这还使用公共表表达式 (CTE),在 Oracle 中称为子查询分解...
MySQL 不支持分析函数,因此您必须使用:
For SQL Server 2005+ and Oracle 9i+, use analytic functions:
This also uses a Common Table Expression (CTE), known as Subquery Factoring in Oracle...
MySQL doesn't have analytic function support, so you have to use:
这应该是最简单的方法,它不涉及任何特定于数据库的选项:
upd:是的,当然,只有当您只需要每个类的一条记录时,这才有效。
upd2:只是为了好玩,提出一个查询,它会显示 TOP N,并且不涉及分析。看起来有点乱,但似乎有效:)
其中
TOP_N
是您需要获取的记录数量。This should be the easiest way, which doesn't involve any database-specific options:
upd: yeah, of course this would work only if you need only one record from each class.
upd2: just for fun come up with a query thta shows you TOP N and doesn't involve analytics. looks kinda messy, but seems to work :)
where
TOP_N
is amount of records you need to get.我在 sql 2008 中对此进行了测试并且对我有用,希望能以某种方式帮助您。
I tested in sql 2008 this and works for me, hope that helps you in some way.
对于 SQL Server 或 Oracle(或实现该标准部分的任何其他引擎,包括免费引擎中的 PostgreSQL),
OVER
子句中的“窗口函数”(例如,参见 此处有关 MS 的文档)使其变得简单;例如,在这个SO问题中,请参阅@Darrel的答案(他正在选择每个类别的前 10 名,您只想要前 1 名,变化应该很明显;-)。在 MySql 或其他不符合 OVER 子句标准的引擎中,您可以使用 @Bill 的答案(对 MySql 有利,对其他人不利)或 @Matt 的答案(可能需要稍作调整,因为他正在回答SQL Server 等使用
SELECT TOP 10 ...
- 在 MySql 中将是SELECT ... LIMIT 10
!-)。With SQL Server or Oracle (or any other engine implementing that part of the standard, including e.g. PostgreSQL among the free ones), the "window functions" in an
OVER
clause (e.g., see here for MS's docs about them) make it easy; e.g., in this SO question, see @Darrel's answer (he's selecting the top 10 per category, you only want the top 1, the changes should be obvious;-).In MySql, or other engine not complying with the standard regarding the
OVER
clause, you could use @Bill's answer (good for MySql, not for others) or @Matt's (may need slight adaptation since he's answering for SQL Server and so usingSELECT TOP 10 ...
-- in MySql that would beSELECT ... LIMIT 10
!-).这是另一种方法
Here is another way