选择每组的前x个记录

TDa*_*obz 3 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
Run Code Online (Sandbox Code Playgroud)

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

Con*_*rix 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
Run Code Online (Sandbox Code Playgroud)

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

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