选择每组的前x个记录

时间:2012-04-19 21:35:33

标签: sql sql-server sql-server-2008

使用以下查询来搜索标题中包含术语的产品。查询返回所需的结果(通常结果太多)。

现在我只希望它能够为每家公司选择最多3个(随机)产品。一些公司返回了许多记录/产品,但我只需要拿3个并继续下一个公司

SELECT p.title As entryname, cname 
FROM company c, product p
WHERE p.title LIKE '%steel%' AND p.cid = c.cid 
GROUP By cname, ca.title

我试图理解分区和排名的东西,但我没有走得太远。我正在使用ms sql

3 个答案:

答案 0 :(得分:7)

您可以使用ROW_NUMBER()执行此操作

with cte as (
SELECT 
    p.title as entryname, cname,
    ROW_NUMBER() OVER (PARTITION BY c.id ORDER BY p.id) rn
FROM company c
    INNER JOIN  product p 
    ON  p.cid = c.cid 
WHERE p.title LIKE '%steel%'
GROUP By cname, ca.title    
)
SELECT 
    p.title as entryname, cname,
FROM CTE where rn <= 3

如果您真的想要随机(而不是具有最低ID的3),您可以将row_number行更改为

ROW_NUMBER() OVER (PARTITION BY c.id order by newid()) rn

答案 1 :(得分:0)

如果您的数据库是SQL Server(在帖子结尾处关闭ms sql),请查看TOP on MSDN

SELECT TOP(3) p.title As entryname, cname 
FROM company c, product p
WHERE p.title LIKE '%steel%' AND p.cid = c.cid 
GROUP By cname, ca.title

对于Oracle,您可以在WHERE子句中使用rownum

SELECT p.title As entryname, cname 
FROM company c, product p
WHERE p.title LIKE '%steel%' AND p.cid = c.cid AND rownum < 4
GROUP By cname, ca.title

答案 2 :(得分:0)

你可以简单地追加

limit 3,5

到查询结尾。作为示例,这将从第3行开始为您提供顺序 5行。

现在选择这5行 randonly 是模式复杂的,我想。